如何在ArrayList中获取前三个最大的值?

6

我有一个填充了整数的arraylist。我只需要一种方法来获取arraylist中前三个整数。


从收到的答案中可以清楚地看出,您的问题有两种解释。您是想要前三个项目,还是最大的三个项目? - andy256
6个回答

8
List<Integer> list;
Collections.sort(list);
List<Integer> top3 = new ArrayList<Integer>(list.subList(Math.max(list.size() - 3, 0), list.size()));

我本可以简单地使用subList,但是从subList()返回的列表是基于原始列表的一个视图,因此在那里进行的更改会反映在top3中。


1
你需要编写自己的比较器并在 ArrayList 上使用 Collections.sort(list, comparator),这将把前三个整数排在最前面(这仅基于比较器中的逻辑)。

那就看原帖的作者了。即使他创建一个子列表,仍然需要遍历整个列表才能获取它们。相反,他可以直接遍历排序后的列表,到第三个位置并获取值!在我看来,我们应该把这部分留给原帖的作者自己去决定! - Rahul
从问题和标签来看,我觉得这更多是关于对列表进行排序,而不是其他任何事情! - Rahul

1

这取决于列表的大小和你想要的性能。如果列表很“小”,那么早期的任何解决方案都可以满足你的要求。

如果列表很“大”且性能很重要,则应该遍历列表并在遍历过程中保留前3个最大值。

另一个权衡是你的时间和错误与使用库。使用提到的任何库方法都比自定义编码的解决方案花费更少的程序员时间。


0

利用List#subList(int fromIndex,int toIndex)

返回此列表中指定的fromIndex(包括)和toIndex(不包括)之间的部分视图。

yourList.subList(yourList.size() -n, yourList.size());

根据子列表文档。

0
使用 Collections.sort 对数组进行排序并取出前三个值。

0
将所有元素放入一个TreeSet中,使用TreeSet(Collection c)构造函数,然后使用TreeSet.descendingIterator获取前3个元素。列表可能包含重复项,使用TreeSet可以保证检索到3个不同的最大值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接