1. ホーム
  2. java

[解決済み] 配列の最小値と最大値を求める Integer.MAX_VALUE と Integer.MIN_VALUE について説明します。

2022-03-05 11:52:56

質問

を理解していないようです。 Integer.MAX_VALUEInteger.MIN_VALUE は、配列の最小値と最大値を求めるのに役立ちます。

最小値と最大値を求めるときのこの方法(以下の疑似コード)の動作は理解できました。

max = A[0], min = A[0]
for each i in A
  if A[i] > max then max = A[i]
  if A[i] < min then min = A[i] 

しかし、このメソッドに関しては、目的がよくわからないのですが Integer.MAX_VALUEInteger.MIN_VALUE :

import java.util.Scanner;

class MyClass {

    public static void main(String[] args) {

        int[] numbers; // declaring the data type of numbers
        numbers = new int[3]; //assigning the number of values numbers will contain
        int smallest = Integer.MAX_VALUE, largest = Integer.MIN_VALUE;

        Scanner input = new Scanner(System.in);

        System.out.println("Please enter 3 numbers");

        for(int counter = 0; counter<numbers.length;counter++) {
            numbers[counter] = input.nextInt();
        }

        for(int i = 0; i<numbers.length; i++) {
            if(numbers[i]<smallest)
                smallest = numbers[i];
            else if(numbers[i]>largest)
                largest = numbers[i];
        }

        System.out.println("Largest is "+largest);
        System.out.println("Smallest is "+smallest);
    }

}

  • System.out.println(Integer.MAX_VALUE) は 2147483647 を出力します。
  • System.out.println(Integer.MIN_VALUE) で -2147483648 になります。

では、Integer.MIN_VALUE と Integer.MIN_VALUE は比較の中でどのような役割を果たすのでしょうか?

どのように解決するのか?

<ブロッククオート

が、この方法に関しては、Integer.MAX_VALUEとInteger.MIN_VALUEの目的がよくわかりません。

で始めることで smallest に設定します。 Integer.MAX_VALUElargest に設定します。 Integer.MIN_VALUE という特殊なケースについて、後で心配する必要はありません。 smallestlargest はまだ値を持っていません。もし私が目を通しているデータに 10 を最初の値として使用する場合 numbers[i]<smallest は真になります(なぜなら 10< Integer.MAX_VALUE を更新します)。 smallest になります。 10 . 同様に numbers[i]>largest は、次のようになります。 true なぜなら 10> Integer.MIN_VALUE を更新し largest . といった具合に。

もちろん、これを行う際には、対象となるデータに少なくとも1つの値があることを確認する必要があります。そうでないと、apocryphalな数字が smallestlargest .


備考 The point Onome Sotu がコメントで述べています。

...配列の最初の項目が他の項目より大きい場合、else-if 文のため、最大の項目は常に Integer.MIN_VALUE になります。

その通りです。この問題を示すより簡単な例です( ライブコピー ):

public class Example
{
    public static void main(String[] args) throws Exception {
        int[] values = {5, 1, 2};
        int smallest = Integer.MAX_VALUE;
        int largest  = Integer.MIN_VALUE;
        for (int value : values) {
            if (value < smallest) {
                smallest = value;
            } else if (value > largest) {
                largest = value;
            }
        }
        System.out.println(smallest + ", " + largest); // 1, 2 -- WRONG
    }
}

修正するには、どちらか。

  1. を使用しないでください。 else または

  2. で開始します。 smallestlargest を最初の要素と等しくし、残りの要素をループさせます。 else if .

その2つ目の例です( ライブコピー ):

public class Example
{
    public static void main(String[] args) throws Exception {
        int[] values = {5, 1, 2};
        int smallest = values[0];
        int largest  = values[0];
        for (int n = 1; n < values.length; ++n) {
            int value = values[n];
            if (value < smallest) {
                smallest = value;
            } else if (value > largest) {
                largest = value;
            }
        }
        System.out.println(smallest + ", " + largest); // 1, 5
    }
}