2012-02-13 63 views
8

我必須完成一個奇怪的特殊場景。它的描述如下:java中具有多種類型值的地圖

我要設計在「」是字符串類型的總是一個地圖。然而,「價值」爲鍵中的一個可以是字符串或List(取決於特定鍵可以具有的值的數目。「值」將是一個字符串,如果該特定鍵只有一個值如果密鑰包含許多值,它必須是一個List)。如何完成這種情況?

例如:有2個鍵中的地圖即「姓名」和「電話號」。一個人只能有一個名字和多個電話號碼。因此,這裏第一個鍵即「Name」應該具有Value的「String」類型,而對於第二個鍵即「Phone Nos」應該具有Value的「List」類型。如何聲明這樣一個Map。可能嗎?

+0

相同的家庭作業是:http://stackoverflow.com/questions/9259997/in-java-how-can-i-work-with-objects-which-can-be-either-string-or -liststring? – 2012-02-13 12:25:06

回答

13

這是可以做到像Map<String, Object>

:我強烈建議考慮您的設計了。您應該爲您的人使用班級。這樣你可以做到:Map<String, Person>Person擁有名字,電話號碼和其他信息的getter和setter。

Person類:

public class Person { 

    private String name; 
    private List<String> phoneNumbers = Collections.emptyList(); 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setPhoneNumbers(List<String> phoneNumbers) { 
     this.phoneNumbers = phoneNumbers; 
    } 

    public void addPhoneNumber(String number) { 
     phoneNumbers.add(number); 
    } 

    public List<String> getPhoneNumbers() { 
     return phoneNumbers; 
    } 
} 
0

爲什麼不把暴露了一個API soring一個或multipel電話號碼,然後可以檢索一個或全部(多個)電話號碼,然後進行一個PhoneNumber包裝類一個String和PhoneNumber的地圖?喜歡的東西:

class PhoneNumber { 


    private String[] phoneNumbers; 


    public void storePhoneNumber(String... phoneNumbers) { 
    this.phoneNumbers = phoneNumbers; 
    } 

    public String getPhoneNumber() { 
    if(phoneNumbers.length>=1) { 
     return phoneNumbers[0]; 
    } else { 
     return null; 
    } 

    } 

    public List<String> getPhoneNumbers() { 
    if(phoneNumbers!=null) { 
     return Arrays.asList(phoneNumbers); 
    } else { 
     return null; 
    } 

    } 

}

2

當然有。挑你的毒藥:

Map<String, Object> mixed = new HashMap<String, Object>(); 

Map<String, Serializable> mixed = new HashMap<String, Serializable>(); 

@SuppressWarnings("rawtypes") 
Map mixed = new HashMap(); 
1

那麼,爲什麼不做一個Map<String, List<String>>?你總是可以一個元素只是添加到列表中,如果只有一個值,或用String和List的共同父類型,因此你會得到

Map<String, Object> 
+0

的用戶請求的方式,使用這樣的結構: '「名稱」 - >「山姆的東西」,「手機號」 - >「1234」,「5678」'仍然有你的例子不會工作。 – nfechner 2012-02-13 12:16:14

+2

番石榴的'ListMultimap'是一個更好的集合而不是'Map >' – 2012-02-13 12:29:58

+0

@nfechner:爲什麼它不起作用?對象可以是任何可以用java表示的東西,或者我在這裏錯過了什麼? – bvanvelsen 2012-02-13 15:34:44

1

我會做下列之一:

  1. 使用Multimap<String, String>Multimap將包含與每個鍵相關的一個或多個值。

  2. 使用Map<String, Either<String, List<String>>>。使用Either來區分單個值或多個值。

相關問題