【问题标题】:Printing repetitions of a String打印字符串的重复
【发布时间】:2017-02-02 08:21:27
【问题描述】:

我有以下代码:

ArrayList<String> processed;
processed = new ArrayList<String>();

int biggest=0;
int w=0;
for (int i=0; i<list.size();i++) {
    if(!processed.contains(list.get(i))) {
        System.out.println(list.get(i) + ": " + Collections.frequency(list, list.get(i)));
        processed.add(list.get(i));
    }
}

for (int i1=0; i1<list.size();i1++) {
    if ((Collections.frequency(list, list.get(i1)))> biggest) {
        biggest=(Collections.frequency(list, list.get(i1)));
        w=i1;
    }
}
System.out.println();
System.out.println ("max == " + list.get(w));

输出是:

sorry: 4
bat: 1
train: 2
teddy: 2
ball: 2
max == sorry

我想从重复次数最多到最少对项目进行排序。我知道我可以使用Collections.Sort 对包含重复的数组进行排序。但是,如何将其与名称匹配?例如。如果我对数组进行了排序并且它变为[4, 2, 2, 2, 1] 我该如何打印:Sorry:4, Teddy: 2, Train: 2, Ball: 2, Bat:1

【问题讨论】:

  • 您使用的是 Java 8 吗?
  • 查找“按属性排序”
  • @RamachandranGA 是的

标签: java arrays string sorting arraylist


【解决方案1】:

Collections.sort 允许您提供Comparator 作为第二个参数,作为与对象进行比较的一种方式。因此,我建议使用您的单词及其频率创建一个类,然后对这些列表进行排序。

【讨论】:

    【解决方案2】:

    使用 HashMap 存储名称和重复对: Map&lt;String, Integer&gt; frequeciesMap = new HashMap&lt;&gt;();

    【讨论】:

      【解决方案3】:

      这是一个使用 Java 8 的示例。它按字符串的出现顺序打印。如果你想把它限制在 top repeat ,你也可以使用 limit 来做到这一点。第一个 Map 有一个频率计数,第二个是排序的。您也可以将两者组合成一个长表达式。希望这符合您的需求!

      ArrayList<String> processed = new ArrayList<String>();
      processed.add("One");
      processed.add("Two");
      processed.add("Two");
      processed.add("Three");
      processed.add("Three");
      processed.add("Three");
      processed.add("Four");
      processed.add("Four");
      processed.add("Three");
      Map<String, Long> counts = processed.stream().collect(Collectors.groupingBy(e -> e, Collectors.counting()));
      
      
      Map<String, Long> sortedCounts = counts.entrySet().stream().sorted(Collections.reverseOrder(Entry.comparingByValue()))
              .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (e1, e2) -> e1, TreeMap::new));
      
      sortedCounts.entrySet().stream()
         .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
         .forEach(System.out::println);
      

      打印

      Three=4
      Four=2
      Two=2
      One=1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-07
        • 2020-06-26
        相关资源
        最近更新 更多