質問

Javaでは、次を使用している分野で null.例えば:

class Foo {
    String bar;
    //....
}

いくBarComparatorのためにこのクラスは、

    private static class BarComparator
            implements Comparator<Foo> {
        public int compare( final Foo o1, final Foo o2 )
        {
            // Implementation goes here
        }
    }

ある標準的な方法で対応できることの o1, o2, o1.bar, o2.barnull, なく、書くネストした if...else?

感謝!

役に立ちましたか?

解決

思wrapへの呼び出しの分野のcompareToメソッドの小さな静的な方法並べ替えにnull高又は最低:

static <T extends Comparable<T>> int cp(T a, T b) {
     return
         a==null ?
         (b==null ? 0 : Integer.MIN_VALUE) :
         (b==null ? Integer.MAX_VALUE : a.compareTo(b));
}

簡単な使用(複数分野としてば):

public int compare( final Foo o1, final Foo o2 ) {
    return cp(o1.field, o2.field);
}

他のヒント

の回答!汎用方法のコンパレータを見て興味深い。

見ることが NullComparatorApache Commons集 (今現在使用):

private static class BarComparator
        implements Comparator<Foo>
{
    public int compare( final Foo o1, final Foo o2 )
    {
        // o1.bar & o2.bar nulleness is taken care of by the NullComparator.
        // Easy to extend to more fields.
        return NULL_COMPARATOR.compare(o1.bar, o2.bar);
    }

    private final static NullComparator NULL_COMPARATOR =
                                            new NullComparator(false);
}

注意:に焦点を当て bar 分野はここでのポイント。

かどうかをご検討の場合、nullを有効な文字列値の比較です。がnullの場合 < や>"apple".このというだがnullの場合==nullになります。合を定義できますがnullの場合はご注文後に記述することができるコードを適切に表す

この場合はいを選択されNullPointerExcpetionはIllegalArgumentExceptionとして扱う場合は、nullでより高いレベルに着地での比較。

で記入することができコンパレータです。きうきクラス名と名前の文字列として個人分野です。getName()、setName()メソッドにアクセスの名前です。以下のコンパレータクラス。

    Collections.sort(list, new Comparator<Person>() {
        @Override
        public int compare(Person a, Person b) {
            if (a == null) {
                if (b == null) {
                    return 0;
                }
                return -1;
            } else if (b == null) {
                return 1;
            }
            return a.getName().compareTo(b.getName());
        }
    });

更新:

Java8を利用でき以下のAPIのリスト。

// Push nulls at the end of List
Collections.sort(subjects1, Comparator.nullsLast(String::compareTo));

// Push nulls at the beginning of List
Collections.sort(subjects1, Comparator.nullsFirst(String::compareTo));

のキーとはここの事はしていけるかを切り開いていくだnullされてしまいます。一部のオプションがあります。a)仮定するnull以前に他のすべてのオブジェ順b)仮定するnull以降他のすべてのオブジェ順c)治療としてnullによってはデフォルト値d)処nullとしてエラー条件です。つきましに全面的に依拠したアプリケーションを引き出す必要がある

最後の場合はもちろん例外をスローします。他の必要なの四if/elseの場合(約三分の符号化の一つだったん結果です。)

使用している場合は、Googleのコレクション、が入っている場合もあり コンパレータ クラスです。場合は、ヘルパーの方法注文nullとしては最大の又は少なくとも要するものと期待される。利用できる 化合物のコンパレータ を低減するための金額です。

また、クラス org.springframework.util.comparator.NullSafeComparator 春の枠組みでご利用いただけます。

例(Java8):

SortedSet<Foo> foos = new TreeSet<>( ( o1, o2 ) -> {
        return new NullSafeComparator<>( String::compareTo, true ).compare( o1.getBar(), o2.getBar() );
    } );

    foos.add( new Foo(null) );
    foos.add( new Foo("zzz") );
    foos.add( new Foo("aaa") );

    foos.stream().forEach( System.out::println );

このまま印刷:

Foo{bar='null'}
Foo{bar='aaa'}
Foo{bar='zzz'}

となっているように思いがない方法ですが、とにかく、コードがこんなに長い。

を使用しないでくださいNullComparator方せんの新しいインスタンスを作成して、クラス毎の比較動作は、場合などんで並べ替えリストは1000件までスケジュールを登録できるようにす1000*log2(1000)オブジェクトを完全には不要です。すぐに問題がある。

のいずれかのサブクラス、または権限を委譲し、実施自身のnullチェックインでもないことなのかな

private static class BarComparator
        implements Comparator<Foo> {
    private NullComparator delegate = new NullComparator(false);

    public int compare( final Foo o1, final Foo o2 )
    {
        return delegate.compare(o1.bar, o2.bar);
    }
}

を検討してお客様POJO.私の答えすることはできない。

Comparator<Customer> compareCustomer = Comparator.nullsLast((c1,c2) -> c1.getCustomerId().compareTo(c2.getCustomerId()));

または

Comparator<Customer> compareByName = Comparator.comparing(Customer::getName,nullsLast(String::compareTo));

と思うの早期返諸表のその他の代替に一番近いホテルです。if

例えば

if(o1==null) return x;
if(o2==null) return x;
if(o1.getBar()==null) return x;
if(o2.getBar()==null) return x;

// No null checks needed from this point.
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top