2012-09-29 57 views
2

我檢索從數據庫中的值,需要被添加到列表,然後基於其值的特定鍵,例如地圖的數量,如何根據類的值將類的對象添加到哈希映射?

row 1 name = "A" category = "1" 
row 2 name = "B" category = "2" 
row 3 name = "C" category = "1" 
row 4 name = "D" category = "3" 

我需要把ROW1和行3在一個列表中,第二行和第四行分別在一個單獨的列表中,然後 將這三個列表放入MAP中,並使用類別名稱(1,2,3)作爲MAP的關鍵字。

MAP 
    1 LIST1 (values of 2 rows) 
    2 LIST2 (values of 1 row) 
    3 LIST3 (values of 1 row) 

我不知道如何將它們添加到列表和MAP。 我的約束是,不是每次檢索值時都會檢索相同的行,因此每次我可能需要不同數量的列表來保留已檢索的每個類別的值。

我的代碼以下,

ResultSet rs = st.executeQuery(SelectRows); 
Map map = new HashMap(); 
if(rs.next()) 
{ 
    item.setRowID(rs.getString("ID")); 
    item.setName(rs.getString("Name"));      
    item.setValue(rs.getString("Value")); 
    item.setCat(rs.getString("Cat")); 
    if(!map.containsKey(rs.getString("Cat"))){ 
     map.put(rs.getString("CatID"), new ArrayList()); 
    } 
    map.get(rs.getString("CatID")).add(row); 
} 

最後一行運行到這個錯誤>「」的方法添加(行)是未定義的類型對象。 即使我將對象添加到列表中,我遇到同樣的錯誤,方法add(List)對於類型Object而言是未定義的。

+0

@ HussainAl-Mutawa,我試圖將它們添加到MAP,但因爲每次我得到不同的cateogotries不知道如何創建列表和設置MAP的關鍵。 –

+1

我的意思是,你可以顯示你的代碼。嘗試解決問題時可能會出錯。 – user1406062

+0

@ HussainAl-Mutawa,感謝您的回答,我編輯了這個問題。 –

回答

6

您需要創建列表的映射。當你閱讀的記錄,如果存在一個鍵(這裏是類),那麼當前行添加到列表中

Map map = new HashMap() 
for(Row row : resultset) { 
     if(!map.containsKey(row.category)){ 
      map.put(row.category, new ArrayList()); 
     } 
     map.get(row.category).add(row.name); 
    } 

UPDATE

的問題是,你需要在這裏指定泛型類型

Map<String, List<Rows>> map = new HashMap<String, List<Rows>>() 
while(rs.next()) { 
     Rows row = new Rows(); 
     /* 
     * code to initialize the values of row from the record 
     */ 
     String category = rs.getString("Cat"); 
     if(!map.containsKey(category)){ 
      map.put(category, new ArrayList<Rows>()); 
     } 
     map.get(category).add(row); 
    } 
+0

其實我正在爲每一行創建一個對象,因爲它們有很多列,並試圖將這些對象添加到代碼中,但它在最後一行發生錯誤。 –

2

您可以使用具有類別的映射作爲鍵和列表的ArrayList作爲值。 ArrayList在添加到它時會自動更改大小。 Map使用put(key,value)添加元素。 ArrayList使用add(element)或add(index,element)。

+0

我有相同的計劃,但正如我所說的,每次我可以如何命名列表並設置地圖的關鍵字,可以檢索具有不同類別的不同行? –

+0

這裏有一個相關的問題:http://stackoverflow.com/questions/1010879/best-way-to-create-a-hashmap-of-arraylist。如果您需要添加到地圖列表中,只需使用類別獲取ArrayList,並將新列表添加到結尾,刪除列表或執行任何您需要的操作。此外,來自Google Collections的Multimap(http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/Multimap.html)可讓您爲以下內容添加多個值同樣的鑰匙。 –

2

我會建議你使用地圖內的地圖

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

外映射將類別對行和值的映射。所以每次你想根據行查詢價值,你都可以輕鬆做到。

0

我們還可以使用數組列表和鏈接列表以及向量空間。

Map<Integer, ArrayList<class-name(means object)>> map = new HashMap<>(); 

Map<Integer, Vector<class-name(means object)>> map = new HashMap<>(); 

Map<Integer, LinkList<class-name(means object)>> map = new HashMap<>(); 

所以使用一個他們。