如何在arraylist中显示重复计数

时间:2018-12-05 03:24:51

标签: java arraylist java-8 hashmap

请考虑由重复项组成的arraylist下面的内容。我该如何滤除出现过4次(例如89:4)的整数89。预期输出89:4

List<Integer> list = Arrays.asList(1, 1, 2, 3, 5, 8, 13, 21, 21, 61, 98, 15, 25, 41, 67,55, 89, 89, 89, 89 );         
Map<Integer ,Long > map = list.stream()
        .collect(Collectors.groupingBy(c ->c , Collectors.counting())) ;
map.forEach(   (k , v ) -> System.out.println( k + " : "+ v ));

//我期望下面的输出 89:4

//上面的代码片段的实际输出(键,值)对,如下所示 1:2 98:1 2:1 67:1 3:1 5:1 8:1 41:1 13:1 15:1 21:2 55:1 89:4 25:1 61:1

6 个答案:

答案 0 :(得分:2)

您可以这样做

Entry<Integer, Long> maxOccurence = list.stream()
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
    .entrySet().stream()
    .max(Comparator.comparing(Map.Entry::getValue))
    .orElseThrow(IllegalArgumentException::new);

答案 1 :(得分:1)

如果您使用Eclipse Collections,则可以使用void printZpattern2(int x) { if (x <= 0) return; std::cout << std::string(x, '0') << std::endl; if (x != 1) { printZpattern2(x - 1); std::cout << std::string(x, '0') << std::endl; } }

topOccurrences

如果要重复所有内容,可以使用List<Integer> list = Arrays.asList(1, 1, 2, 3, 5, 8, 13, 21, 21, 61, 98, 15, 25, 41, 67,55, 89, 89, 89, 89 ); MutableList<ObjectIntPair<Integer>> top = Lists.adapt(list).toBag().topOccurrences(1); System.out.println(top.makeString()); 。这会滤除1、21和89。

selectDuplicates

您也可以在不装原语的情况下执行此操作。

MutableBag<Integer> dupes = Lists.adapt(list).toBag().selectDuplicates();
System.out.println(dupes.toStringOfItemToCount());

注意:我是Eclipse Collections的提交者。

答案 2 :(得分:1)

另一种方式是

Map<Integer, Integer> temp = new HashMap<>();
int maxCount = 0;
  for (Integer i : list) {
   maxCount = Integer.max(maxCount , temp.merge(i, 1, Integer::sum));
  }
int finalMax = maxCount;
temp.values().removeIf(v->v!= finalMax);


 Map<Integer, Integer> temp = new HashMap<>();
    int maxCount = 0;
    int maxKey = 0;
    for (Integer i : list) {
        int count = temp.merge(i, 1, Integer::sum);
        if (maxCount < count)
            maxKey = i;
        maxCount = Integer.max(maxCount , count);
    }
    System.out.println(maxKey + " :" + maxCount);

答案 3 :(得分:0)

简短且易于记忆的版本。它的大O值确实为O(n ^ 2),但是对于小列表而言,它在具有GC压力的高度并发环境中提供了最佳性能,因为HashMaps和Map.Entry对象占用空间并严重利用了CPU缓存:

import static java.util.Collections.frequency;
import static java.util.Comparator.comparingInt;
...
List<Integer> list = Arrays.asList(1, 1, 2, 3, 5, 8, 13, 21, 21, 
        61, 98, 15, 25, 41, 67,55, 89, 89, 89, 89 );

list.stream()
  .max(comparingInt(x -> frequency(list, x)))
  .map(x -> x + " : " + frequency(list,x))
  .ifPresent(System.out::println);

打印89 : 4,即<most frequent int> : <num occurences>

答案 4 :(得分:0)

您可以使用Apache Bag

  

定义一个集合,该集合计算对象出现在集合中的次数。   假设您有一个包含{a,a,b,c}的Bag。在a上调用getCount(Object)将返回2,而在调用uniqueSet()时将返回{a,b,c}。

Example

 Bag<Integer> bag = new HashBag<>(
 Arrays.asList(1, 2, 3, 3, 3, 1, 4));         
 assertThat(2, equalTo(bag.getCount(1)));

答案 5 :(得分:-1)

希望,这会有所帮助...

List<Integer> list = Arrays.asList(1, 1, 2, 3, 5, 8, 13, 21, 21, 61,
            98, 15, 25, 41, 67,55, 89, 89, 89, 89 );
Optional<Map.Entry<Integer, Long>> max = list.stream()
            .collect(Collectors.groupingBy(obj -> obj, Collectors.counting()))
            .entrySet()
            .stream()
            .max(Comparator.comparing(Map.Entry::getValue));

if(max.isPresent()) {
    System.out.println(max.get());
}