6

私はこのようなことを考えています:

public static <T extends Comparable<T>> T minOf(T...ts){        
    SortedSet<T> set = new TreeSet<T>(Arrays.asList(ts));
    return set.first();
}

public static <T extends Comparable<T>> T maxOf(T...ts){
    SortedSet<T> set = new TreeSet<T>(Arrays.asList(ts));
    return set.last();
}

しかし、ヌルセーフではありません。これも私が望んでいることです。

この問題を解決するためのより良い方法を知っていますか?

編集:

コメントの後、私もmin()を試しました:

public static <T extends Comparable<T>> T minOf(T...ts){        
    return Collections.min(Arrays.asList(ts), new Comparator<T>(){

        public int compare(T o1, T o2) {
            if(o1!=null && o2!=null){
                return o1.compareTo(o2);
            }else if(o1!=null){
                return 1;
            }else{
                return -1;  
            }
        }});
}

それについてどう思いますか?

4

3 に答える 3

38

Collections.maxの何が問題になっていますか?

そして、なぜあなたはヌルの安全性を気にするのですか?コレクションにnullを含めることを許可してもよろしいですか?

于 2008-12-15T19:13:19.220 に答える
5

結果から「null」を本当に除外する必要があり、それが配列に含まれるのを防ぐことができない場合は、単純なループで配列を反復処理し、「最小」と「最大」を追跡する必要があります。 " 別々の変数で。各オブジェクトで「compare()」メソッドを使用して、現在の「最小」および「最大」値と比較できます。このようにして、null をチェックして無視するための独自のコードを追加できます。

編集:これは、私が話していることを説明するためのコードです。残念ながら、考慮しなければならないエッジ ケースがあります。渡されたすべての引数が null の場合はどうなるでしょうか。あなたのメソッドは何を返しますか?

public static <T extends Comparable<T>> T minOf(T...ts){
    T min = null;
    for (T t : ts) {
        if (t != null && (min == null || t.compareTo(min) < 0)) {
            min = t;
        }
    }
    return min;
}

public static <T extends Comparable<T>> T maxOf(T...ts){
    T max = null;
    for (T t : ts) {
        if (t != null && (max == null || t.compareTo(max) > 0)) {
            max = t;
        }
    }
    return max;
}
于 2008-12-15T19:19:10.097 に答える
1

インターフェイスの契約に違反するため、null を受け入れるように実装しないでくださいComparable

https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.htmlから:

null はどのクラスのインスタンスでもないことに注意してください。e.equals(null) が false を返しても、e.compareTo(null) は NullPointerException をスローする必要があります。

代わりに、たとえば代わり​​に新しいインターフェイスを作成する必要がありますComparableNull

以下も参照してください。

于 2015-06-02T12:26:51.170 に答える