2016-11-21 67 views
1

下面的問題是,在Java中HashMap中字符串和計數數目

樣本數據:https://tartarus.org/martin/PorterStemmer/output.txt

我有包含類似於上述列表中有許多重複的單詞的tokenizationString字符串數組話。

我必須將該字符串數組轉換爲散列表,然後使用散列表來計算每個單詞的使用次數(計算字符串數組中的重複值,但我必須使用散列表相關的方法)。

我想這樣做

Map<Integer, String> hashMap = new HashMap<Integer, String>();  
      for(int i = 0 ; i < tokenizationString.length; i++) 
       { 
        hashMap.put(i, tokenizationString[i]); 

       } 

在那之後我將不得不時間#它們用於字符串數組排序。

最後,我希望能夠打印出結果,如:

the "was used" 502 "times" 
i "was used" 50342 "times" 
apple "was used" 50 "times" 

回答

1

而不是

hashMap.put(i, tokenizationString[i]); 

第一次檢查,如果這個詞已經存在,並增加相應的條目:

int count = hashMap.containsKey(tokenizationString[i]) ? hashMap.get(tokenizationString[i]) : 0; 
hashMap.put(tokenizationString[i], count + 1); 
+0

嗨我已經嘗試過,但代碼無法正常工作。你用Java寫了嗎? 我改變了上面的代碼到 Map hashMap = new HashMap (); 它的工作原理。所以hashmap的結構將爲 String:是映射的鍵 Integer:是鍵重複的次數。 –

+0

是的,你需要保留字符串作爲hashmap的關鍵字,並將count作爲值。 –

3

首先,你的地圖應該像Map<String, Integer>(字符串,其頻率)。 我給你的Java 8流解決方案。

public static void main(String[] args) { 
    try (Stream<String> lines = Files.lines(Paths.get("out.txt"))) { 
     Map<String, Long> frequency = lines 
       .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) 
       .entrySet() 
       .stream() 
       .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) 
       .collect(Collectors.toMap(
         Map.Entry::getKey, 
         Map.Entry::getValue, 
         (o, n) -> o, 
         LinkedHashMap::new 
       )); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

上面的代碼將逐行從文件中讀取。然後收集爲頻率圖。然後再將它們轉換爲entrySet流。然後根據相反的順序對數據流進行排序。最後將它們收集爲LinkedHashMapLinkedHashMap,因爲它會保持insersion順序。看看Java 8 Stream API。

0

您可以通過Google Gauva library的MultiMap類實現此功能,如下所示。在這個鏈接也找到工作示例 - https://gist.github.com/dkalawadia/8d06fba1c2c87dd94ab3e803dff619b0

FileInputStream fstream = null; 
    BufferedReader br = null; 
    try { 
     fstream = new FileInputStream("C:\\temp\\output.txt"); 
     br = new BufferedReader(new InputStreamReader(fstream)); 

     String strLine; 

     Multimap<String, String> multimap = ArrayListMultimap.create(); 
     // Read File Line By Line 
     while ((strLine = br.readLine()) != null) { 
      multimap.put(strLine, strLine); 
     } 

     for (String key : multimap.keySet()) { 
      System.out.println(key + "was used " + multimap.get(key).size() + "times"); 
     } 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (fstream != null) { 
      fstream.close(); 
     } 
     if(br!=null){ 
      br.close(); 
     } 
    }