Collections.max()的正确用法是什么?

时间:2017-10-12 13:42:27

标签: java arrays

据我所知,Collections.max方法实现了一个循环来确定数组的最大值。

但是,由于某些原因,它不会为我返回最大值,而是返回第一个值。我已尝试使用多个数据集,但我一直得到相同的结果。

Scanner input = new Scanner(System.in);
int num;
int inputNum;
ArrayList<Integer> total = new ArrayList<>();
ArrayList<Integer> set1 = new ArrayList<>();
ArrayList<Integer> set2 = new ArrayList<>();
ArrayList<Integer> set3 = new ArrayList<>();
ArrayList<Integer> set4 = new ArrayList<>();
ArrayList<Integer> set5 = new ArrayList<>();
ArrayList<Integer> set6 = new ArrayList<>();
ArrayList<Integer> set7 = new ArrayList<>();
ArrayList<Integer> set8 = new ArrayList<>();
ArrayList<Integer> set9 = new ArrayList<>();

System.out.println("Please enter the values of your dataset"
    + " (between 1-50. Once you are done filling it in,"
    + " please type any number greater than 51.");

do {
    // Sort the values here
    inputNum = input.nextInt();
    if (6 > inputNum) {
        total.add(inputNum);
        set1.add(inputNum);
    } else if (11 > inputNum && inputNum > 5) {
        total.add(inputNum);
        set1.add(inputNum);
    } else if (11 > inputNum && inputNum > 5) {
        total.add(inputNum);
        set2.add(inputNum);
    } else if (16 > inputNum && inputNum > 10) {
        total.add(inputNum);
        set3.add(inputNum);
    } else if (21 > inputNum && inputNum > 15) {
        total.add(inputNum);
        set4.add(inputNum);
    } else if (26 > inputNum && inputNum > 20) {
        total.add(inputNum);
        set4.add(inputNum);
    } else if (31 > inputNum && inputNum > 25) {
        total.add(inputNum);
        set5.add(inputNum);
    } else if (36 > inputNum && inputNum > 30) {
        total.add(inputNum);
        set6.add(inputNum);
    } else if (41 > inputNum && inputNum > 35) {
        total.add(inputNum);
        set7.add(inputNum);
    } else if (46 > inputNum && inputNum > 40) {
        total.add(inputNum);
        set8.add(inputNum);
    } else if (51 > inputNum && inputNum > 45) {
        total.add(inputNum);
        set9.add(inputNum);
    }
} while (51 > inputNum);

//find average, maximum, range, median, histogram
int sum = 0;
for (double i : total)
    sum += i;
System.out.println("sum total of dataset: "+ sum);

double sizeTotal = total.size();
System.out.println("number of data points entered: " + sizeTotal);

double average = sum / sizeTotal;
System.out.println("The average value of your data is: " + average);

//maximum
Collections.max(total);
System.out.println("The highest value in the array is: " + total.get(0));

4 个答案:

答案 0 :(得分:2)

只需将最后一行更改为:

System.out.println("The highest value in the array is: " + Collections.max(total));

你会得到正确的结果。

Collections.max(total)不会对集合进行排序/更改。它只返回最大值。

这是documentation

答案 1 :(得分:1)

Collections.max()不返回已排序的集合 如果您想要列表中的最大值,请将代码修改为

Integer highest = Collections.max(total);
System.out.println("The highest value in the array is: " + highest);

答案 2 :(得分:0)

这里你干得好干净。 Collection.max()会返回最大值,total.get(0)仍然会为您提供最初存储的值。

您可以看到相同here的良好实现。

import java.util.*;
public class HelloWorld{
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int num;
        int inputNum;
        ArrayList<Integer> total= new ArrayList<Integer>();
        ArrayList<Integer> set1= new ArrayList<Integer>();
        ArrayList<Integer> set2= new ArrayList<Integer>();
        ArrayList<Integer> set3= new ArrayList<Integer>();
        ArrayList<Integer> set4= new ArrayList<Integer>();
        ArrayList<Integer> set5= new ArrayList<Integer>();
        ArrayList<Integer> set6= new ArrayList<Integer>();
        ArrayList<Integer> set7= new ArrayList<Integer>();
        ArrayList<Integer> set8= new ArrayList<Integer>();
        ArrayList<Integer> set9= new ArrayList<Integer>();
        System.out.println("Please enter the values of your dataset (between 1-50. Once you are done filling it in, please type any number greater than 51.");
        do {
        //sort the values here
        inputNum = input.nextInt();
        if (6 > inputNum){
        total.add(inputNum);
        set1.add(inputNum);
        }
        else if (11 > inputNum ){ // obviously it is greater than 5 otherwise it won't come to the else part.
        total.add(inputNum);
        set1.add(inputNum);
        }
        else if (11 > inputNum ){
            total.add(inputNum);
            set2.add(inputNum);
            }
        else if (16 > inputNum ){
            total.add(inputNum);
            set3.add(inputNum);
            }
        else if (21 > inputNum){
            total.add(inputNum);
            set4.add(inputNum);
        }
        else if (26 > inputNum){
            total.add(inputNum);
            set4.add(inputNum);
            }
        else if (31 > inputNum){
            total.add(inputNum);
            set5.add(inputNum);
            }
        else if (36 > inputNum){
            total.add(inputNum);
            set6.add(inputNum);
            }
        else if (41 > inputNum){
            total.add(inputNum);
            set7.add(inputNum);
            }
        else if (46 > inputNum){
            total.add(inputNum);
            set8.add(inputNum);
            }
        else if (51 > inputNum){
            total.add(inputNum);
            set9.add(inputNum);
            }
        }
        while (51 > inputNum);
        //find average, maximum, range, median, histogram
        //average
        int sum = 0;
        for (double i : total)
            sum += i;
        System.out.println("sum total of dataset: "+ sum);
        double sizeTotal = total.size();
        System.out.println("number of data points entered: " + sizeTotal);
        double average = sum / sizeTotal;
        System.out.println("The average value of your data is: " + average);
        //=======
        //maximum
        int max = Collections.max(total);
        System.out.println("The highest value in the array is: " + max);
    }
}

Stdin输入:

3 8 13 18 28 58

输出:

Please enter the values of your dataset (between 1-50. Once you are done filling it in, please type any number greater than 51.
sum total of dataset: 70
number of data points entered: 5.0
The average value of your data is: 14.0
The highest value in the array is: 28

答案 3 :(得分:0)

说明

方法Collections#max执行不排序您的收藏。它找到并返回最大值。

引用其documentation

  

根据元素的自然排序,返回给定集合的最大元素

非常重要:

  

此方法遍历整个集合,因此需要时间与集合的大小成比例。

因此操作 。如果性能确实很重要,您可以记住并更新构建集合时的最大值。

现在让我们来看看您当前的代码:

Collections.max(total);
System.out.println("The highest value in the array is: " + total.get(0));

您的通话Collections.max(total)正确计算并返回最大值,但您未捕获 返回值,您只需将其丢弃< /强>

total.get(0)的调用会正确返回您的集合中的第一个元素。但由于Collections#max未按顺序更改任何内容,因此此元素仍然相同,可能不是最大值

解决方案

不是假设方法对集合进行排序,您只需使用其返回值,这是您要搜索的最大值:

int maxValue = Collections.max(total);
System.out.println("The highest value in the array is: " + maxValue);

或者不将值存储在变量中:

System.out.println("The highest value in the array is: " + Collections.max(total));