2

私は単純な最大値と最小値のメソッドを書こうとしていましたが、書いたように、これほど複雑であってはならないと感じずにはいられません….多分私は間違っているのでしょうか? 私の最大のコードは次のように機能します。貧弱な疑似コードを許してください:

配列に 10 個の乱数を入力します。0 が最小の最大値であるため、0 に初期化された最大変数を作成します。各要素を max と比較します。要素が max より大きい場合は、max の値を問題の要素に置き換えます。

max を 0 に初期化する必要があるという事実が気に入らないのですが、これよりも良い方法があるのではないでしょうか?

私の最小コードは、私を除いて同様に機能します。私の最小値が配列要素よりも低いことを比較してください。要素が低い場合は、min を置き換えます。

これについて私が本当に気に入らないのは、min を最大の乱数 (この場合は 50) に初期化する必要があることです。

私の質問は次のとおりです。これを行うためのより良い方法はありますか? このコードをより効率的に記述する方法はありますか?

import java.util.Random;

public class Main {

public static void main(String[] args) {

    //Declare min and max
    int max=0;
    int min;
    //Array of 10 spaces
    int[] ar=new int[10];
    //fill an array with random numbers between 0 and 50

    for(int i=0;i<10;i++)
    {
        ar[i]=new Random().nextInt(50);
    }

    //Test max algorithm
    //loop trough elements in array
    for(int i=0;i<10;i++)
    {
        //max is set to 0, there should always be a maximum of 0
        //If there isnt 0 will be the maximum

        //If element is greater then max
        //replace max with that element
        if(ar[i]>max)
        {
            max=ar[i];
        }
    }
    System.out.println("The max is "+ max);

    //Test min
    //Initialising min to maximum Random number possible?
    min=50;
    for(int i=0;i<10;i++)
    {
        if(ar[i]<min){
            min=ar[i];
        }
    }
    System.out.println("The min is "+min);


}

}

4

7 に答える 7

6

配列の最初の要素 (つまりnumbers[0]) を初期値として常に取得し、2 番目の要素からループを開始できます。

int[] numbers = new int[10];
int max, min;
...
min = max = numbers[0];
for(int i = 1; i < numbers.length; ++i) {
    min = Math.min(min, numbers[i]);
    max = Math.max(max, numbers[i]);
}
于 2012-10-20T11:26:13.560 に答える
5

わかりました。他の人がすでに回答を投稿している間、私はあなたのコードをもっと使いやすいと思うものに編集するために時間をかけました。

  1. 静的メソッドを作成します。それらは再利用できます。
  2. 省略記号(...)を使用します。これは、コードのように配列引数でメソッドを呼び出すことができるためですが、引数の数を可変にすることもできますmin(5,3,8,4,1)
  3. データ型が提供する可能な最小/最大数で初期化します
  4. コードが機能することを確認するには、最初に配列内の項目を印刷する必要があります。何が含まれているかわからない場合、結果が正しいかどうかを判断する方法がないためです。
  5. これらは徹底的にテストされ、効率的に機能することが知られているため、標準ライブラリの既存のメソッドに基づいてコードを作成します(min / maxは些細な例のように見えます)。
  6. コードにパフォーマンスの問題があることを実際に示すことができない限り、パフォーマンスについてはあまり気にしません。優先順位は、1番目の正確さ、2番目の可読性/保守性、3番目のパフォーマンスのようにする必要があります。

これのほとんどはすでに他の人によって言及されていますが、とにかく、ここにコードがあります:

import java.util.Random;

public class MinMax {

    public static int min(int... args) {
        int m = Integer.MAX_VALUE;
        for (int a : args) {
            m = Math.min(m, a);
        }
        return m;
    }

    public static int max(int... args) {
        int m = Integer.MIN_VALUE;
        for (int a : args) {
            m = Math.max(m, a);
        }
        return m;
    }

    public static void main(String[] args) {

        // fill an array with random numbers between 0 and 50
        int[] ar = new int[10];
        for (int i = 0; i < 10; i++)
        {
            ar[i] = new Random().nextInt(50);
            System.out.println(ar[i]);
        }

        int maxValue = max(ar);
        int minValue = min(ar);

        System.out.println("The max is " + maxValue);
        System.out.println("The min is " + minValue);
    }
}
于 2012-10-20T11:37:18.003 に答える
2

いくつかのヒント:

  1. 最初の要素で初期化minし、2 番目の要素から開始します。

    int min = ar[0];
    for(int i=1;i<10;i++)
    
  2. ...または次から開始:

    int min = Integer.MAX_VALUE;
    

    配列が空になる可能性があると予想される場合は、このアプローチが適しています。

  3. 明示的な条件を回避するために使用Math.minします (遅いと言う人もいます):

    for(int i=0;i<10;i++)
    {
       min = Math.min(min, ar[i]);
    }
    
于 2012-10-20T11:30:06.973 に答える
1

数値が変更されると、最大を 0 に初期化して最小を 50 に初期化することはできません。より適切な方法は次のとおり
です。 1. 配列の最初の要素に初期化します。
2.length定数の代わりに使用します。

max = ar[0];  
    for(i=0;i<ar.length; i++)  
    {  
            if(ar[i]>max)  
            {  
                max=ar[i];  
            }  
    }

分についても同じ:

min = ar[0];
for(i=0;i<ar.length; i++)
{
        if(ar[i]<min)
        {
            min=ar[i];
        }
}
于 2012-10-20T11:26:29.917 に答える
0
public static void main(String[] args) {
     int[] myArray = {9, 7,9, -40, -10, 40};
    //int[] myArray = {};
    //int[] myArray = {4};
    System.out.println("Difference between max and min = "
            + findDifference(myArray));
}

// Find difference between Max and Min values for a given array
public static int findDifference(int[] arr) {

    if (arr.length == 0) {
        // Log
        System.out.println("Input Array is empty");

        return Integer.MIN_VALUE;
    }

    int min = arr[0];
    int max = arr[0];

    for (int i = 1; i < arr.length; i++) {
        if (arr[i] < min)
            min = arr[i];
        else if (arr[i] > max)
            max = arr[i];
        // Just to check if logic works fine
        System.out.println("Min=" + min + " Max=" + max);
    }

    return max - min;

}
于 2013-02-07T06:19:55.070 に答える
0

同じメソッドで最大関数と最小関数が必要かどうかに応じて、戻り値の型も考慮する必要があります。

これまでのところ、ほとんどの提案では 2 つを別々に保っています。つまり、int を返しても問題ありません。ただし、最大関数と最小関数を findLargestDifference メソッドに入れると、int 配列内の任意の数値の最大差が 2 int になる可能性があるため、long を返す必要があります。また、int 配列を 2 回ループする必要がなくなります。

さらに、メインメソッドで印刷する代わりに、コーナーケースとエッジケースのユニットテストを書くことをお勧めします. ロジックを実装するときの早い段階でロジックをテストするのに役立ち、多くの場合、コードがよりクリーンになります。

以下のコード例を参照してください。

public class LargestDifference {

public static long find(int[] numbers) {
    if (numbers == null || numbers.length == 0) {
        throw new IllegalArgumentException("Input cannot be null or empty.");
    }else {
        long currentMax = numbers[0];
        long currentMin = numbers[0];

        for (int i=0; i < numbers.length; i++) {
            if (currentMin > numbers[i]) {
                currentMin = numbers[i];
            }else if (currentMax < numbers[i]) {
                currentMax = numbers[i];
            }
        }
        return currentMax - currentMin;
    }
}
于 2015-09-21T09:44:25.993 に答える