2017-10-18 9 views
2

私はmin maxというオブジェクトに配列の最小値と最大値を返すコードをいくつか持っています。私の質問はforループの中にあり、各反復で新しいMinMaxオブジェクトを作成する必要があります。それとも私たちはとても似のMinMaxのメンバ変数を更新することができます:メンバ変数へのアクセスと新しいオブジェクトの作成

globalMinMax.largest = Math.min(globalMinMax.smallest, localMinMax.smallest); 
globalMinMax.smallest = Math.max(globalMinMax.largest, localMinMax.largest)); 

をする代わりに、我々は

private static class MinMax { 
    public Integer smallest; 
    public Integer largest; 

    public MinMax(Integer smallest, Integer largest) { 
    this.smallest = smallest; 
    this.largest = largest; 
    } 

    private static MinMax minMax(Integer a, Integer b) { 
    return Integer.compare(b, a) < 0 ? new MinMax(b, a) : new MinMax(a, b); 
    } 
} 

public static MinMax findMinMax(List<Integer> A) { 
    if (A.size() <= 1) { 
     return new MinMax(A.get(0), A.get(0)); 
    } 

    MinMax globalMinMax = MinMax.minMax(A.get(0), A.get(1)); 
    // Process two elements at a time. 
    for (int i = 2; i + 1 < A.size(); i += 2) { 
    MinMax localMinMax = MinMax.minMax(A.get(i), A.get(i + 1)); 
    **********Do we need to create a new object here?***** 
    globalMinMax 
     = new MinMax(Math.min(globalMinMax.smallest, localMinMax.smallest), 
        Math.max(globalMinMax.largest, localMinMax.largest)); 
    } 
    // If there is odd number of elements in the array, we still 
    // need to compare the last element with the existing answer. 
    if ((A.size() % 2) != 0) { 
     globalMinMax 
     = new MinMax(Math.min(globalMinMax.smallest, A.get(A.size() - 1)), 
        Math.max(globalMinMax.largest, A.get(A.size() - 1))); 
    } 
    return globalMinMax; 
} 
+0

なぜ 'Integer.compare(b、a)<0'は' b shmosel

+0

問題があると思われますか?どうしてそう思うの?あなたのアイデアを試しましたか?なぜ入力が必要なのですか? – shmosel

+0

Imは、オブジェクトに直接アクセスするのではなく、新しいキーワードを使用することに利点があるかどうか疑問に思っています。著者がその決定を下した理由とそれが重要かどうか疑問に思っています – Matt

答えて

1

このコードの下のコードで主演ライン上で行うように新しいのMinMaxを毎回作成するには複雑すぎますそのこと。生成したMinMaxクラスを使用して、リストの最小/最大のストアとして動作する必要がありますが、計算中に使用しないでください。

int minimum = A.get(0); 
int maximum = A.get(0); 
for(int i=1; i < A.size(); i++){ 
    if(A.get(i) < minimum) minimum = A.get(i); 
    if(A.get(i) > maximum) maximum = A.get(i); 
} 
return new MinMax(minimum, maximum); 

、あなたの全体的なプログラムによりのMinMaxクラスを組み込みたい場合は、あなたが何かのように呼ばれるクラスに静的メソッドを追加することができます。リストの最小/最大値が同じくらい簡単です見つける

generateMinMaxFromListは、指定されたIntegerリストから静的にminMaxオブジェクトを生成します。

0

globalMinMaxを更新すると、データがマルチスレッド環境でアクセスされない場合に提供される2つのソリューションより優れたソリューションになります。また、最小値と最大値を見つけるために、多くのオブジェクトを回転させる必要はありません(特にループの内側)。反復処理中のソースコレクションに多くの要素がある場合、オーバーヘッドが発生する可能性があります。

ただし、反復ごとにMinMaxオブジェクトの新しいインスタンスを作成する必要がある状況があります。これは、データに作用する複数のスレッドをスピンアップするときに発生します。


- 渡されたリストが空の場合に例外をスローしますMinMaxメソッド内で最初のチェック。メソッド内の最初のステートメントとしてA.size() == 0のチェックを行い、適切なアクションを実行します。

関連する問題