2014-08-30 99 views
0

我想Id和名稱存儲到一個Java集合是這樣的:存儲值的Java集合

121 Name_1 
332 Name_9 
334 Name_e 
.......... 

我可以用一個HashMap但我需要能夠將收藏與更像值延長這個:

121 Name_1 1 
332 Name_9 1 
334 Name_e 3 
............ 

是否有Java集合可以存儲這些值而不使用Object?

+0

你希望能夠擴展你的集合的所有元素,或者只是其中的一部分? – Savail 2014-08-30 08:27:58

+0

如果你需要爲每個鍵添加額外的值,也許你可以使用列表的地圖? – gla3dr 2014-08-30 08:28:52

+0

@ gla3dr你能告訴我一些例子嗎? – user1285928 2014-08-30 08:30:24

回答

4

您可以考慮使用諸如JSON Simple之類的庫,它可以爲記錄的字段數量提供靈活性。這裏是一個取自this的示例頁面:

import org.json.simple.JSONObject;

JSONObject obj=new JSONObject(); 
obj.put("name","foo"); 
obj.put("num",new Integer(100)); 
obj.put("balance",new Double(1000.21)); 
obj.put("is_vip",new Boolean(true)); 
obj.put("nickname",null); 
System.out.print(obj); 
+0

有沒有第三方庫的解決方案? – user1285928 2014-08-30 08:33:10

+0

@ user1285928你是否嘗試過'HashMap',同時使用ID作爲'Key'和名稱爲'Value'? – Juxhin 2014-08-30 08:35:39

+0

您的示例未能在普通的'HashMap '上顯示此'JSONObject'的任何優點。此外,您正在執行不必要的值的手動換行。沒有必要說'新的整數','新的雙精度'和'新的布爾值'。如果你堅持手動操作,你應該學習'static'' valueOf'方法...... – Holger 2014-08-31 10:24:15

5

您應該定義一個類中的數據:

public class Whatever { 
    private final String name; 
    private final int someValue; 

    public Whatever(String name, int someValue) { 
     this.name = name; 
     this.someValue = someValue; 
    } 

    public String getName() { return name; } 
    public in getSomeValue() { return someValue; } 
} 

然後使用它是這樣的:

Map<Integer, Whatever> theData = new HashMap<>(); 
theData.put(121, new Whatever("Name_1", 1)); 

(當然,給類及其字段有意義的名字!)

+0

你在'theData.put'語句中缺少一個右括號。否則,雖然,很好的答案。 – bcsb1001 2014-08-30 08:39:57

+0

@ bcsb1001:謝謝,修復。順便說一句,對於這些小錯誤,你可以自己編輯答案(如果你有足夠的代表)。 – 2014-08-30 08:41:52

+0

我沒有足夠的代表(現在是614),但是,當我有足夠的時間時,我會編輯這樣的東西。 – bcsb1001 2014-08-30 08:42:47

2

@ gla3dr的評論是什麼意思是HashMap<String,List> sample = new HashMap<String,List>();

然後你把數據放到你的列表中。

List myData = new ArrayList(); 

myData.add("121"); 
myData.add("Name_1"); 
myData.add("1"); 

然後將其放在HashMap中

sample.put("key",myData); 

這樣你仍然可以訪問列表

List myList = sample.get("key"); 
+0

當然,@ TobiasBrandt的解決方案仍然是最好的。這是一個醜陋的黑客。 – gla3dr 2014-08-30 08:47:58

+0

此外,你可能剛剛做了它來簡化你的答案的代碼,但原始類型讓我畏縮。 – gla3dr 2014-08-30 08:51:16

+0

yup TobiasBrandt's將是最好的解決方案,但@ user1285928詢問如果他/她想添加更多而不考慮值的數量。這就是我從這個問題所理解的。這就是爲什麼我只使用這種原始類型。 – 2014-08-30 08:53:08

0

這裏是你如何可以存儲這些可能的解決方案:

Map<Integer, List<String>> map = new HashMap<Integer, ArrayList<String>>(); 

然後你可以cre吃了列表的第一個值:

List<String> list = new ArrayList<>(); 
list.add("Name_1"); 

然後用鑰匙一起添加到地圖:

map.put(121, list); 

然後,當你想擴展的一個值,你可以添加到列出像這樣:

map.get(121).add("1"); 

當然,這意味着這兩個名字,第二個數字都被存儲String秒。如果您想存儲不同的類型,則必須將它們存儲爲Object s。

0

既然你DONOT要使用的對象,只有集合,你可以試試下面的代碼: -

 // Individual column names which can be extended 
     static final String KEY_ID = "id"; 
     static final String KEY_NAME = "name"; 
     static final String KEY_NUM = "title"; 


     // Contains all the rows 
     ArrayList<HashMap<String, Object>> mapList = new ArrayList<HashMap<String, Object>>(); 

     // Contains column data in individual rows 
     HashMap<String, Object> map1 = new HashMap<String, Object>(); 
     map1.put(KEY_ID, 121); 
     map1.put(KEY_NAME, "Name_1"); 
     map1.put(KEY_NUM, 1); 

     HashMap<String, Object> map2 = new HashMap<String, Object>(); 
     map2.put(KEY_ID, 334); 
     map2.put(KEY_NAME, "Name_e"); 
     map2.put(KEY_NUM, 3); 

     mapList.add(map1); 
     mapList.add(map2); 

請注意,您可以通過行循環,並只創建一個映射參考變量,而不是MAP1和MAP2和依此類推,併爲每一行分配一個新的Hashmap對象,以使代碼看起來更清晰。