2016-11-21 4 views
1

вопрос ниже в JavaHashMap Строка и Count число раза используется каждое слово

Sample данные: https://tartarus.org/martin/PorterStemmer/output.txt

У меня есть массив tokenizationString Строки, которые содержат слова, которые похожи на список выше со многими дублированными слова.

Мне нужно преобразовать этот строковый массив в хэш-карту, а затем использовать hashmap для подсчета количества раз, когда используется каждое слово (подсчитайте дублируемое значение в массиве строк, но я должен использовать метод, связанный с hashmap).

Я имею в виду делать таким образом

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? Я внес изменения в код, указанный выше, в Карта hashMap = new HashMap (); и он работает. Таким образом, hashmap будет иметь структуру String: есть ключ от карты Целое число: это количество повторений ключа. –

+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. Затем отсортируйте поток на основе значения в обратном порядке. Наконец, заберите их как LinkedHashMap. LinkedHashMap, потому что он будет поддерживать порядок преобразования. Взгляните на Java 8 Stream API.

0

Вы можете достичь этого путем использования класса MultiMap Google Gauva library, как показано ниже. Также найдите рабочий пример по этой ссылке - 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(); 
     } 
    }