我认为没有任何直接的方法可以使用标准库来做到这一点。
以下代码包含一个实用方法,用于获取最大元素数的集合。
它的工作原理是将最大元素保存在TreeSet 中,只有当它属于最大元素时才会将元素插入其中。树集非常适合这里,因为它可以快速找到最小元素,并测试一个元素是否包含在集合中。
通过这种方式,您可以获得良好的性能,并且可以灵活地使用所需的最大元素数量。
public class MultipleMaxElements {
public static void main(String[] args) {
List<Integer> l = List.of(4, 2, 5, 8, 2, 8, 0, 1);
System.out.println(maxElements(l, 3, Comparator.naturalOrder()));
System.out.println(maxElements(l, 3, Comparator.<Integer>naturalOrder().reversed()));
}
public static <T> Set<T> maxElements(Iterable<T> list, int nrElems, Comparator<T> cmp) {
TreeSet<T> maxSet = new TreeSet<>(cmp);
for (T elem : list) {
if (maxSet.size() < nrElems) {
maxSet.add(elem);
} else if (!maxSet.contains(elem) && cmp.compare(elem, maxSet.first()) > 0) {
maxSet.pollFirst();
maxSet.add(elem);
}
}
return maxSet;
}
}
在问题文本中,您没有写任何关于如何处理输入列表中的重复元素的内容。此方法返回最大的唯一元素。
如果应保留重复项,则可以使用基于树的 Guava 多集而不是普通的 TreeSet。