2015-05-25 52 views
0

似乎HashMap被限制爲僅一個值,我需要像的數值表:哪個Map類應該用於包含不同類型的數據?

喬(字符串)25(整數)2.0(雙)

史蒂夫(字符串)41(整數)1.6(雙)

欲信息來源存儲類似於在二維陣列,但我希望它具有不同的變量類型。我看過各種Map實現類,但它們似乎只存儲值(分配給一個鍵)或兩個變量(我至少需要三個)。我應該使用什麼類?

+0

在地圖上存儲地圖 – Babel

+0

@looser能詳細說明一下嗎? –

回答

7

聽起來你應該創建一個帶有String字段,int字段和double字段的獨立類。

然後,您可以創建一個以值爲類型的映射,以及您喜歡的任何類型作爲鍵。例如:

Map<String, Person> map = new HashMap<>(); 
// What keys do you really want here? 
map.put("foo", new Person("Joe", 25, 2.0)); 
map.put("bar", new Person("Steve", 41, 1.6)); 

,或者它可能是你甚至不需要一張地圖都在這一點上:

List<Person> list = new ArrayList<>(); 
list.add(new Person("Joe", 25, 2.0)); 
list.add(new Person("Steve", 41, 1.6)); 
+0

我假設OP想要將名稱映射爲整數和雙精度,所以也許人們的名字應該用作鍵,而不是「foo」和「bar」。 – SamTebbs33

+1

@ SamTebbs33:我故意讓他們有所不同,以表明否則就會有冗餘 - 正如我之前所說的,目前還不清楚是否需要映射。已經添加了一條評論來提示OP對此進行更多的思考。 –

0

讓一個節點同時存儲整數和雙精度值?

2

使表示要存儲的數據的類,例如。

class Person { 
    String name; 
    //rest 
} 

然後使地圖像地圖。地圖類型無關

1

我會建議你創建一個簡單的類,存儲整數和雙對,然後映射到一個字符串(我認爲這是所需的結果)。

HashMap<String, Pair<Integer, Double>> map = new HashMap<String, Pair<Integer, Double>>; 
map.put("Steve", new Pair<Integer, Double>(41, 1.6)); 

凡對被定義爲

class Pair<T, K> { 

    public T val1; 
    public K val2; 

    public Pair(T val1, K val2){ 
     this.val1 = val1; 
     this.val2 = val2; 
    } 
} 
1

有許多方法可以做到這一點。

最好的方法是Jon Skeet和@ novy1234建議的方式。創建一個代表一個人的自定義類(或者表中的任何行)。然後使用該類的Map或List來表示「表」。 (地圖,您可以選擇字段/列作爲一個重點之一......如果這是適當的。)

所以,你可能最終得到一個HashMap<String, Person>ArrayList<Person> ...其中Person是你的自定義類。

第二種方法是將表示各行作爲Map<String,Object>,使得(例如)"name"映射到"Joe""age"映射到25"height"映射到2.0。 (他很高)。那麼表格可以是這些地圖的MapList

第二種方式的變化是Map<String, Map<String, Object>>,其中外部地圖的鍵是每個人的名字,內部地圖的鍵是字段名;例如"age""height"

但是,當已知列集時,使用Map<String, Object>來表示一行並不是一個好的Java解決方案。自定義類將使用比Map(任何味道)少得多的空間,並且常規getter方法比Map.get(key)方法快幾個數量級。另外,Map.get(...)方法會返回給您一個Object,它必須在使用前轉換爲預期的類型。在運行時,類型轉換會有失敗的風險,因爲你(以某種方式)錯誤地填充了行/映射。

如果在編譯時不知道列,或者如果有稀疏填充的列數不可控,則應該只考慮使用Map來表示表中的行。 (這裏也不是這種情況......)


那麼,您應該使用哪個Map類?

您的替代品包括HashMap,TreeMap,LinkedHashMapConcurrentHashMap。每個人都有不同的屬性和不同的目標用例。但是,如果你的桌子很小,並且沒有特定的要求,那麼它可能沒有真正的區別。

相關問題