如何获取数组的最小值和最大值?

8
这是我的代码。我需要获取数组的最小值和最大值,以便获得范围,每当我输入数字时,最小值都为0。请帮帮我。谢谢:)
final AutoCompleteTextView inputValues = (AutoCompleteTextView) findViewById(R.id.txt_input);
final TextView txtMinimum = (TextView) findViewById(R.id.txtMinimum);
final TextView txtMaximum = (TextView) findViewById(R.id.txtMaximum);
final TextView txtRange = (TextView) findViewById(R.id.txtRange);

Button btncalculate = (Button)findViewById(R.id.btncalculate);
btncalculate.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        String []values = ( inputValues.getText().toString().split(","));
        int[] convertedValues = new int[values.length];

        // calculate for the minimum and maximum number
        int min = 0;
        int max=0;

        min = max = convertedValues[0];
        for (int i = 0; i < convertedValues.length; ++i) {
            convertedValues[i] =Integer.parseInt(values[i]);
            min = Math.min(min, convertedValues[i]);
            max = Math.max(max, convertedValues[i]);
        }
        txtMinimum.setText(Integer.toString(min));
        txtMaximum.setText(Integer.toString(max));

        // calculate for the range
        int range=max - min;
        txtRange.setText(Integer.toString(range));

    }});

使用Java 8流,您可以在一行代码中完成它。 - Wen-Bin Luo
10个回答

29

使用Collections能够在您的代码中找到最小值和最大值。

以下是示例代码:

 List<Integer> list = Arrays.asList(100,2,3,4,5,6,7,67,2,32);

   int min = Collections.min(list);
   int max = Collections.max(list);

   System.out.println(min);
   System.out.println(max);

输出:

2
100

7
int[] convertedValues = new int[10];
int max = convertedValues[0];

for (int i = 1; i < convertedValues.length; i++) {
    if (convertedValues[i] > max) {
        max = convertedValues[i];
    }
}

同样地,通过改变较小的符号来寻找最小值。

6
我知道这很傻,但你可以从i=1开始:) - smerlung

6
int minIndex = list.indexOf(Collections.min(list));

或者
public class MinMaxValue {

    public static void main(String[] args) {
        char[] a = {'3', '5', '1', '4', '2'};

        List b = Arrays.asList(ArrayUtils.toObject(a));

        System.out.println(Collections.min(b));
        System.out.println(Collections.max(b));
   }
}

@dipali...好的和不错的。 - Piyush

5
你可以对数组进行排序并获取位置0length-1:
Arrays.sort(convertedValues);

int min = convertedValues[0];
int max = convertedValues[convertedValues.length - 1];

Arrays#sort(int[])

将指定的int数组按升序排序。

因此,在排序后,第一个元素是最小值,最后一个元素是最大值。


1
对数组进行排序的复杂度比扫描要高。对于小型数组,这不是问题,但如果它们变得相当大,则仅迭代值并进行比较肯定会更快。 - DRobinson
同意DRobinson的观点,不应该使用排序,线性扫描更便宜。 - Russel Yang

3

1
关于这种策略的一般说明:它意味着界限将是O(n log n)(参见:https://www.cs.cmu.edu/~avrim/451f11/lectures/lect0913.pdf)。在想要达到O(n)的情况下,您需要避免排序。 - Alex Moore-Niemi

1
public static int[] getMinMax(int[] array) {

    int min = Integer.MAX_VALUE; //or -1
    int max = Integer.MIN_VALUE; //or -1
    for(int i : array) { //if you need to know the index, use int (i=0;i<array.length;i++) instead
        if(i < min) min = i; //or if(min == -1 || array[i] < array[min]) min = i; 
        if(i > max) max = i; //or if(max == -1 || array[i] > array[max]) max = i;
    }
    return new int[] {min, max};
}

排序至少需要O(n log(n))的时间,其中n是数组中元素的数量。如果你只是查看数组中的每个元素,则找到最小和最大元素的时间为O(n)。对于大型数组来说,这样做会更快。


0
在你的代码中删除以下部分:
(min = max = convertedValues[0];)

并将min初始化为1:

(int min = 1) 

0

我认为你只是漏了一个检查.. 你应该将min和max变量定义为-1,并添加以下检查。

if (min == -1) {
    min = convertedValues[i];
}

或者,您可以将它们定义为Integer.parseInt(values [0])。他已经将它们预设为convertedValues [0],但尚未在其中存储任何内容,也没有解析出values [0]的值(就像在循环中较低的两行中所做的那样)。 - DRobinson

0
for(int i = 1; i < convertedValues.length; i++) {
    if(convertedValues[i]>max) 
        max=convertedValues[i];
    if(convertedValues[i]<min)
        min=convertedValues[i]; 
}

0
        int n = Integer.parseInt(values[0]);
        convertedValues[i] = n;
        int min = n;
        int max = n;

        for(int i = 1; i < convertedValues.length; ++i) {
            n = Integer.parseInt(values[i]);
            convertedValues[i] = n;
            min = Math.min(min, n);
            max = Math.max(max, n);
        }

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