2016-06-14 10 views
0

これは単なる疑問な質問ですが、私はしばらく探していましたが、回答が得られません。Comparableオブジェクトのより小さいインスタンスとより大きいインスタンスを専用変数に抽出する

void someMethod(Timeslot t1, Timeslot t2) { 
    Timeslot start, end; 
    if (t1.compareTo(t2) >= 0) { 
     start = t1; 
     end = t2; 
    } else { 
     start = t2; 
     end = t1; 
    } 
    // do something with start and end 
} 

t1t2は、通常範囲の限界ですが、この方法では、下限及び第二のことを第一引数を必要としない、次のブロックはかなり頻繁に繰り返されるThrought私のプロジェクト

高いほうになるように、私はちょうどあなたが上に見ることができるものをして、どの限界がどれほど些細なものかを理解します。

ちょうどDRYになりたいのですが、もっと簡潔な方法でこれを行う方法や方法があるのだろうかと思います。おそらくJava 8の新機能のいくつかがこれをやってくれます。このようなもの?

void someMethod(Timeslot t1, Timeslot t2) { 
    Timeslot t1, t2; 
    assignLimits(t1, t2, Timeslot::compareTo); // does this exist? 
} 

おそらく私が求めているのは絶対的に些細なことであり、わたしは明らかに何かを欠いているかもしれません。この場合、私にこれを見てもらうのを助けてください。または、元のチャンクを繰り返すだけで何も問題はありません。

+1

「最小」と「最大」で「ペア」を返すものを自分で作成します。 –

+0

また、2つの要素の 'LinkedList'と' getFirst'と 'getLast'を'ソート 'します。または 'List'と' get(0) 'と' get(1) 'です。 –

+1

AFAIK Javaには、ネイティブにペアがありません。 – dabadaba

答えて

0

参照で2つのローカル変数を渡すことはできず、2つの変数に割り当てるメソッドから2つの値を返す方法がないため、このようなユーティリティ関数を提供することはできません。この制限を回避するためのすべての試みは、2つのローカル変数をスワップするだけで、大部分の開発者は使用することができないほど過剰なものとみなされます。完全のために

ここではいくつかの選択肢、:

  1. が与えられたとして、初期化t1t2はまだ利用可能なので、必要な場合にのみ

    void someMethod(Timeslot t1, Timeslot t2) { 
        Timeslot start=t1, end=t2; 
        if (t1.compareTo(t2) < 0) { 
         start = t2; 
         end = t1; 
        } 
        // do something with start and end 
    } 
    

    を交換し、我々は一時的なしで交換するためにそれらを使用することができます変数はここにあります。 t1をstartとして、t2をendとして再利用することもできるので、初期割り当ては必要ありません。その場合、スワッピングには一時変数が必要です。したがって、読みやすさは改善されません。

  2. ヘルパーメソッド経由:

    static final <T extends Comparable<? super T>> T max(T t1, T t2) { 
        return t1.compareTo(t2)>=0? t1: t2; 
    } 
    static final <T extends Comparable<? super T>> T min(T t1, T t2) { 
        return t1.compareTo(t2)<0? t1: t2; 
    } 
    void someMethod2(Timeslot t1, Timeslot t2) { 
        Timeslot start=min(t1, t2), end=max(t1, t2); 
        // do something with start and end 
    } 
    

    方法は、再使用することができます。 min関数は、自然な順序で等しい2つの別個のオブジェクトがメソッドに渡された場合、2つの同一のオブジェクトを取得するのを避けるために、等しい要素に関して意図的に異なる動作をすることに注意してください。明らかな欠点は、2つの比較が必要であることです。

  3. 経由ストリーム:

    void someMethod3(Timeslot t1, Timeslot t2) { 
        Timeslot[] range=Stream.of(t1, t2).sorted().toArray(Timeslot[]::new); 
        // do something with range[0] and range[1] 
    } 
    

    これは、例えば、同様のソリューションの家族のための例示であり、 Timeslot[] range={ t1, t2}; Arrays.sort(range);などです。これらは最も簡潔なソリューションですが、2つの値を配列として表現する必要があり、オブジェクト/配列を使用せずに複数の値を返すことができない既成関数の問題を示しています。

関連する問題