按字母顺序打印列表中每个单词的计数

时间:2019-06-17 17:49:54

标签: java

我想按字母顺序打印ArrayList中每个单词的计数。 我已经实现了代码,但是对于列表中的元素“ hihi”,我希望计数应为2而不是1。如何实现?

 {//some code
                 Collections.sort(list);

            System.out.println("Words with the count");
            Map<String, Long> st1=new TreeMap<>();
            for(String k : list){
                st1.put(k,st1.getOrDefault(k, 0L)+1);
            }
            for(String k : st1.keySet()){
            System.out.println(k+": "+st1.get(k));
        }
    //end of class}

2 个答案:

答案 0 :(得分:1)

在设计上不能保证HashSet中的顺序。

来自docs

  

它不保证集合的迭代顺序;

如果您想使用Set,则需要使用保证顺序的集合。 LinkedHashSet保证插入顺序。

答案 1 :(得分:1)

请注意在TreeSet上使用HashSet。 TreeSet将使用元素的自然顺序对其进行排序。如果您希望使用不同的排序顺序,可以将Comparator传递给TreeSet的构造函数。

您应该注意,您当前的代码效率不高,因为它必须遍历整个列表以获取每个单词的频率计数。您最好先处理列表,然后计算频率并将其存储在地图中。例如:

    Map<String, Long> frequency = new TreeMap<>();
    for (String word : list) {
        frequency.put(word, frequency.getOrDefault(word, 0L) + 1);
    }

    for (String word : frequency.keySet()) {
        System.out.println(word + ": " + frequency.get(word));
    }

您还可以使用流来执行以下操作。

    list.stream()
        .collect(Collectors.groupingBy(Function.identity(), TreeMap::new, Collectors.counting()))
        .forEach((k, v) -> System.out.println(k + ": " + v));