HashMap字符串和计数每个单词的使用次数

时间:2016-11-21 03:14:03

标签: java hashmap concurrenthashmap

以下问题在Java

示例数据:https://tartarus.org/martin/PorterStemmer/output.txt

我有一个tokenizationString String数组,其中包含类似于上面列表的单词,包含许多重复的单词。

我必须将该字符串数组转换为hashmap,然后使用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"

3 个答案:

答案 0 :(得分:2)

首先,您的地图应该像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因为它会保持破坏顺序。看看Java 8 Stream API。

答案 1 :(得分:1)

而不是

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

首先检查单词是否已存在,然后递增相应的条目:

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

答案 2 :(得分: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();
        }
    }