List<Man> list=new ArrayList<Man>();
Man manA = new Man(29); // constructor parameter is age, use manA.age to get 29
list.add(manA);
Man manB = new Man(23);
list.add(manB);
Man manC = new Man(42);
list.add(manC);
Man manD = new Man(38);
list.add(manD);
我想在manC
中获取最大年龄元素list
,
最好(最快)的方法是什么?
答案 0 :(得分:4)
无论如何,你必须在O(N)时间内完成它,除非你使用的不是列表。
Man maxAge = new Man(0);
for(Man man : list) {
if(man.age > maxAge.age) {
maxAge = man;
}
}
这将简单地浏览整个列表,记录其遇到的年龄最大的人。循环结束后,maxAge将是其中最老的。
修改强>
在回复你对Collections.max“更好”的评论时,我想我只是包含这个注释,所以没有人感到困惑。从某种意义上来说,接口比较器是一种很好的做法,而且它是java.util的一部分也很好。但是,如果你看一下源代码(下面附带),它就完全一样。因此在算法上,它并不是更好(更快,如上所述)。
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> collection) {
Iterator<? extends T> it = collection.iterator();
T max = it.next();
while (it.hasNext()) {
T next = it.next();
if (max.compareTo(next) < 0) {
max = next;
}
}
return max;
}
答案 1 :(得分:3)
或者您可以将Man对象添加到使用Red-Black树底层的 TreeSet 。这意味着树在添加时保持顺序。它是O(log(N))。
答案 2 :(得分:2)
Man maxAge = null;
for (Man man: list)
{
if (maxAge==null || man.getAge() > maxAge.getAge())
maxAge = man;
}