Java:如何在ArrayList中找到前10个最常见的String +频率?

Ion*_*ona 5 java arraylist hashmap duplicates topmost

我试图在ArrayList中找到前10个最常见的字符串+它们的计数(出现频率).

我怎样才能以最佳时间复杂度做到这一点?

下面的代码在表单中找到最常见的单词+频率(String = int)

例如= 2

  public static Entry<String, Integer> get10MostCommon(WordStream words) {

    ArrayList<String> list = new ArrayList<String>();
    Map<String, Integer> stringsCount = new HashMap<>();
    Map.Entry<String, Integer> mostRepeated = null;

    for (String i : words) {
      list.add(i);
    }

    for (String s : list) {
      Integer c = stringsCount.get(s);
      if (c == null)
        c = new Integer(0);
      c++;
      stringsCount.put(s, c);
    }

    for (Map.Entry<String, Integer> e : stringsCount.entrySet()) {
      if (mostRepeated == null || mostRepeated.getValue() < e.getValue())
        mostRepeated = e;
    }
    return mostRepeated;
  }
Run Code Online (Sandbox Code Playgroud)

Fed*_*ner 13

您可以使用Java 8流分两步完成:

Map<String, Long> map = list.stream()
        .collect(Collectors.groupingBy(w -> w, Collectors.counting()));

List<Map.Entry<String, Long>> result = map.entrySet().stream()
        .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
        .limit(10)
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

第一个流通过使用Collectors.groupingBy()with 来将单词映射到它们的频率Collectors.counting().

这将返回一个映射,其条目按照相反的顺序进行流式处理并按映射条目值排序.然后,流被限制为仅保留10个元素,这些元素最终被收集到列表中.

  • @FedericoPeraltaSchaffner该死你擅长Java! (2认同)