请考虑由重复项组成的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
答案 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}。
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());
}