似乎HashMap
被限制爲僅一個值,我需要像的數值表:哪個Map類應該用於包含不同類型的數據?
喬(字符串)25(整數)2.0(雙)
史蒂夫(字符串)41(整數)1.6(雙)
等
欲信息來源存儲類似於在二維陣列,但我希望它具有不同的變量類型。我看過各種Map實現類,但它們似乎只存儲值(分配給一個鍵)或兩個變量(我至少需要三個)。我應該使用什麼類?
似乎HashMap
被限制爲僅一個值,我需要像的數值表:哪個Map類應該用於包含不同類型的數據?
喬(字符串)25(整數)2.0(雙)
史蒂夫(字符串)41(整數)1.6(雙)
等
欲信息來源存儲類似於在二維陣列,但我希望它具有不同的變量類型。我看過各種Map實現類,但它們似乎只存儲值(分配給一個鍵)或兩個變量(我至少需要三個)。我應該使用什麼類?
聽起來你應該創建一個帶有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));
我假設OP想要將名稱映射爲整數和雙精度,所以也許人們的名字應該用作鍵,而不是「foo」和「bar」。 – SamTebbs33
@ SamTebbs33:我故意讓他們有所不同,以表明否則就會有冗餘 - 正如我之前所說的,目前還不清楚是否需要映射。已經添加了一條評論來提示OP對此進行更多的思考。 –
讓一個節點同時存儲整數和雙精度值?
使表示要存儲的數據的類,例如。
class Person {
String name;
//rest
}
然後使地圖像地圖。地圖類型無關
我會建議你創建一個簡單的類,存儲整數和雙對,然後映射到一個字符串(我認爲這是所需的結果)。
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;
}
}
有許多方法可以做到這一點。
最好的方法是Jon Skeet和@ novy1234建議的方式。創建一個代表一個人的自定義類(或者表中的任何行)。然後使用該類的Map或List來表示「表」。 (地圖,您可以選擇字段/列作爲一個重點之一......如果這是適當的。)
所以,你可能最終得到一個HashMap<String, Person>
或ArrayList<Person>
...其中Person
是你的自定義類。
第二種方法是將表示各行作爲Map<String,Object>
,使得(例如)"name"
映射到"Joe"
,"age"
映射到25
和"height"
映射到2.0
。 (他很高)。那麼表格可以是這些地圖的Map
或List
。
第二種方式的變化是Map<String, Map<String, Object>>
,其中外部地圖的鍵是每個人的名字,內部地圖的鍵是字段名;例如"age"
和"height"
。
但是,當已知列集時,使用Map<String, Object>
來表示一行並不是一個好的Java解決方案。自定義類將使用比Map
(任何味道)少得多的空間,並且常規getter
方法比Map.get(key)
方法快幾個數量級。另外,Map.get(...)
方法會返回給您一個Object
,它必須在使用前轉換爲預期的類型。在運行時,類型轉換會有失敗的風險,因爲你(以某種方式)錯誤地填充了行/映射。
如果在編譯時不知道列,或者如果有稀疏填充的列數不可控,則應該只考慮使用Map來表示表中的行。 (這裏也不是這種情況......)
那麼,您應該使用哪個Map
類?
您的替代品包括HashMap
,TreeMap
,LinkedHashMap
和ConcurrentHashMap
。每個人都有不同的屬性和不同的目標用例。但是,如果你的桌子很小,並且沒有特定的要求,那麼它可能沒有真正的區別。
在地圖上存儲地圖 – Babel
@looser能詳細說明一下嗎? –