找到List的最大年龄元素的最佳方法

时间:2010-12-13 01:28:48

标签: java math

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

最好(最快)的方法是什么?

3 个答案:

答案 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;
}