【问题标题】:Simple way to count occurrences of String and sort by them计算字符串出现次数并按它们排序的简单方法
【发布时间】:2012-07-15 08:03:28
【问题描述】:

我正在查看一个冗余的字符串列表,例如

{ "One", "One", "One", "Two", "Three", "Three" }

计算出现次数的最佳方法是什么,然后创建一个非冗余的字符串列表,按出现次数排序

我想要的结果是这样的列表:

{ "One", "Three", "Two" }

【问题讨论】:

  • 你可以使用修改后的Set,它会自动只保留一个实例,你可以在另一个变量中保留一个计数。
  • 使用树形图而不是hasamap
  • 尝试使用带有比较器的 TreeMap docs.oracle.com/javase/1.5.0/docs/api/java/util/…
  • 您可以在空间上拆分以获取单词,然后使用哈希集删除重复项like so 吗?抱歉,如果我遗漏了什么
  • @aishwarya 您缺少 counting events 位。

标签: java sorting counting


【解决方案1】:

你可以在这个关于how to sort the map by its values的问题的投票最多的答案中使用这个技巧。

这是一个示例实现(我在比较器中添加了泛型):

  • 您将字符串/出现添加到哈希映射中
  • 将所有内容放入一个带有自定义比较器的 TreeMap 中,该比较器对值进行排序
  • 将密钥放回列表中
public static void main(String[] args) {
    String[] strings = {"One", "One", "One", "Two", "Three", "Three"};

    //Count occurences
    Map<String, Integer> map = new HashMap<String, Integer>();

    for (String s : strings) {
        if (map.containsKey(s)) {
            map.put(s, map.get(s) + 1);
        } else {
            map.put(s, 1);
        }
    }

    ValueComparator<String, Integer> comparator = new ValueComparator<String, Integer> (map);
    Map<String, Integer> sortedMap = new TreeMap<String, Integer> (comparator);
    sortedMap.putAll(map);

    List<String> sortedList = new ArrayList<String> (sortedMap.keySet());

    System.out.println(sortedMap);
    System.out.println(sortedList);

}

static class ValueComparator<K, V extends Comparable<V>> implements Comparator<K> {

    Map<K, V> map;

    public ValueComparator(Map<K, V> base) {
        this.map = base;
    }

    @Override
    public int compare(K o1, K o2) {
         return map.get(o2).compareTo(map.get(o1));
    }
}

【讨论】:

  • 链接下的技巧非常脆弱,因为它假定键下的值永远不会改变。详细遵循该配方至关重要:在构建数据时使用一个映射(可​​以是哈希映射),然后使用自定义比较器将所有内容倒入到树形图中。
  • @MarkoTopolnik 你说得对——并不像我想象的那么简单。
【解决方案2】:

Java 8 中可以快速完成。

Map<String, Long> sortedByCountSet =  Stream.of("One", "One", "One", "Two", "Three", "Three")
            .collect(Collectors.groupingBy(str->str,TreeMap::new,Collectors.counting()));

System.out.println(sortedByCountSet);

在此处输出:-

{一=3,三=2,二=1}

Map<String, Long> sortedByCountSet = Stream.of("One", "One", "One", "Two", "Three", "Three","Five","Five")
            .collect(Collectors.groupingBy(str->str, Collectors.counting()))
            .entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,(e1, e2) -> e1,LinkedHashMap::new));

输出:-

{二=1,五=2,三=2,一=3}

【讨论】:

    【解决方案3】:

    您可以创建一个 Map,浏览您的列表,每次遇到新事件时将其放入列表中并将整数值设置为 1,每次遇到重复项时,只需将该特定键的值加一.

    然后根据哈希图中的计数创建排序列表。

    或者正如其他人建议的那样,使用 TreeMap 将允许您进行排序而不是创建单独的列表。

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      相关资源
      最近更新 更多