【问题标题】:Finding the largest value in an ArrayList [duplicate]在 ArrayList 中查找最大值 [重复]
【发布时间】:2012-10-08 19:27:17
【问题描述】:

我有两个不同的函数来尝试在 ArrayList 中找到最大值。 我有两个,因为我第一次看到它们是否会返回相同的值,然后是性能时间。

但是,它们正在复制相同的值,但它似乎是 ArrayList 的最后一个值,无论它是否最大。我认为它可能是取键而不是取值。

代码如下,我认为这只是一个简单的错误,但谁能指出我正确的方向?

double highest = fitnessArray.get(0);

for (int s = 0; s <fitnessArray.size(); s++){
    if (fitnessArray.get(s)>highest)
        highest=fitnessArray.get(s);

}

System.out.println("highest fitness = " + highest 
                + " indoexOf = " + fitnessArray.indexOf(highest));

double highestFitness;

highestFitness = Collections.max(fitnessArray);
System.out.println("lowest fitness 2 = " + highestFitness );

【问题讨论】:

  • indexOf() 的调用是 100% 冗余的,以及对 get() 的两次调用。
  • 您的代码看起来不错,我试过了,它给了我正确的值。 fitnessArray 中有什么内容?
  • 另外,你的 for 循环应该从索引 1 开始,因为你已经在 for 循环之前检查了索引 0。

标签: java collections arraylist


【解决方案1】:

使用已有的 api

Collections.max(arrayList);

例子

import java.util.ArrayList;
import java.util.Collections;

public class Main {

  public static void main(String[] args) {

    ArrayList<Integer> arrayList = new ArrayList<Integer>();

    arrayList.add(new Integer("3"));
    arrayList.add(new Integer("1"));
    arrayList.add(new Integer("8"));
    arrayList.add(new Integer("3"));
    arrayList.add(new Integer("5"));

    Object obj = Collections.max(arrayList);
    System.out.println(obj);
  }
}

Documentation

你也可以考虑一个稍微差一点的解决方案

Collections.sort(arrayList); // Sort the arraylist
arrayList.get(arrayList.size() - 1); //gets the last item, largest for an ascending sort

如果您稍后需要排序列表,第二种方法可能会很有用。

【讨论】:

  • “稍微差一点的解决方案”取决于应用程序。如果n 足够大,比如 10 亿个元素,假设每个元素需要 1 个工作单元,那么 O(n log(n)) 大约是 300 亿个工作单元,可能非常糟糕。
【解决方案2】:

如果您存储最大数字所在的索引,您可能会有更好的运气:

if (fitnessArray.size() > 0) {
    double highest = fitnessArray.get(0);
    int highestIndex = 0;

    for (int s = 1; s < fitnessArray.size(); s++){
        double curValue = fitnessArray.get(s);
        if (curValue > highest) {
            highest = curValue;
            highestIndex = s;
        }
    }

    System.out.println("highest fitness = " + highest + " indoexOf = " + highestIndex);
}

【讨论】:

  • 啊,是的,我只是从原始示例中复制了它。我以为他们事先检查了数组是否为空。
  • 您应该存储大小而不是总是调用该方法。对于有效的 java,A for each 也是可取的。
猜你喜欢
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 2017-03-16
  • 2012-09-14
  • 2015-05-01
  • 1970-01-01
相关资源
最近更新 更多