2014-03-13 84 views
1

我有這樣的輸入。獲取值的索引

0 Overcast Yes 4 
0 Rainy Yes 3 
0 Sunny No 3 
1 Cool No 1 
1 Cool Yes 3 

我想這些數據存儲在一個HashMap

{0=[Overcast Yes 4,Rainy Yes 3,Sunny No 3]} 
{1=[Cool No 1,Cool Yes 3]} 

到目前爲止,我所做的是

 Map<String, List<String>> mapPart = new HashMap<String, List<String>>(); 
     List<String> tmpList = new ArrayList<String>(); 
     while((partLine = bfpart.readLine())!=null){ 
      String restOfString=""; 
      String[] first = partLine.split(" "); 
      String firstPart = first[0]; 
      for (int i=1; i<first.length; i++) 
      { 
       restOfString += first[i]; 
       restOfString += " "; 
      } 
      if(mapPart.isEmpty()){ 
       tmpList.add(restOfString); 
       mapPart.put(firstPart, tmpList); 
      } 
      else{ 
       for (Map.Entry<String, List<String>> entry : mapPart.entrySet()) { 
       String colId = entry.getKey(); 
       if(colId.equals(firstPart)){ 
       List<String> lst = mapPart.get(colId); 
       lst.add(restOfString); 
       mapPart.put(colId,lst); 
       } 
       else{ //should we craete a new list 
       } 
      } 

     } 

電流輸出

map: {0=[Overcast Yes 4 , Rainy No 2 , Sunny No 3 ]} 

我想計算這個等式。

Info(n)=([no.of yes for overcast,no.of No for overcast],[no.of yes for Rainy,no.of no for Rainy],[no.of yes for Sunny,no.of no for Sunny])

Info0([4,0],[3,0],[0,3])/log2 
Info1([3,1])/log2 
  1. 是上面的一個很好的方式與這個公式
  2. 或讀取文件本身的公式可以做還是不做?
+0

什麼是你想實現什麼?替換現有的值或東西? – mvreijn

+1

你一定要檢查一下'Map'代表什麼以及它對你有什麼好處 - 我認爲你把地圖誤認爲一個列表。 – Smutje

+0

@mvreijn:我試圖將輸出結果作爲「{0 = [陰雨是4,雨水是3,陽光3號],1 = [冷卻否1,冷水是3]}」 –

回答

0

有做

List<String> value = mapPart.get(firstPart); //1. Get the List<String> for the key 
if(value == null) { //2. If it doesn't exist, then create and put it against the key 
    value = new ArrayList<String>(); 
    mapPart.put(first, value); 
} 
value.add(restOfString); //3. Finally add the values for the key 
+0

感謝Sanbhat:在其他部分,我們需要創建一個新的條目。在當前給出的答案,我們只會得到o值 –

0

HashMap中不存儲基於指標值的更簡單的/可讀的方式。你不需要那裏的索引。你可以做這樣的事情。

else{ 
for (Map.Entry<String, List<String>> entry : mapPart.entrySet()) { 
    String colId = entry.getKey(); 
    if(colId.equals(firstPart)){ 
    List<String> lst = get(colId); 
    lst.add(restOfString); 
    mapPart.put(colId,lst); 
    } 
} 
+0

Map >不適用於參數(字符串,布爾值)。 mapPart.get(colId).add(restOfString)是布爾值 –

+0

編輯答案以添加列表。 – anirudh

1

您不需要遍歷整個哈希映射。這是在地圖的想法,你可以通過按鍵非常有效地搜索:

List<String> list = mapPart.get(firstPart); 
if (list == null) { 
    // first time using this index 
    list = new ArrayList<String>(); 
    mapPart.put(firstPart, list); 
} 
list.add(restOfString); 

(更換您的for (Map.Entry<...循環在這個片段)

+0

在mapPart.get(firstPart) –

+1

中顯示「Type mismatch:can not convert from List to String」對不起,請再試一次。 「列表」的類型應該是'列表'當然是 –

+0

我可以分別得到值.pls看我的編輯 –