2016-12-25 1 views
1

nullまたは空のオブジェクトがArrayListの最後に来なければならないオブジェクトの配列リストをソートしたい。ここでは2つのプロパティに基づいてソートしています。名前と金額。 Javaの8のよう並べ替え中に配列リストの最後にヌルまたは空のオブジェクトを配置する

public int compare(Object o1, Object o2) { 
     String username1=((User) o1).getName(); 
     String username2=((User) o2).getName(); 
     int namecomp=username1.compareTo(username2); 
      if(namecomp!=0){ 
       return namecomp; 
      } 
      else{ 
       Integer useramount1= ((User) o1).getAmount(); 
       Integer useramount2=((User) o2).getAmount(); 
       return useramount1.compareTo(useramount2); 
      } 
     } 
    }); 
+0

あなたはnull要素のソートについて何かを試してみましたか? – luk2302

+0

はい、null以外の要素に対しては正常に動作しています。 –

答えて

3

、この機能は、すでにComparator.nullsLastで、ライブラリ内に存在します。

Collections.sort(coll, Comparator.nullsLast(new YourComparator())); 

そのままあなたの現在のコンパレータは動作しますが、 Comparator.nullsLastnull要素を処理し、それらが行くようになります最終。


は、Java 7を使用する必要がある場合、あなたはnull値がo1o2のヌル-ITYに応じてcompareから適切な値を返すことで終わりにソートしますことを確認することができます:

  • o1nullで、o2
  • 0でない場合 o1o2は両方 null
  • リターン1であれば0を返します
  • リターン-1 o1nullないとo2

であれば、完全なComparatorクラスは、このように実装することができます

static class UserComparator implements Comparator<User> { 
    @Override 
    public int compare(User o1, User o2) { 
     if (o1 == null) { 
      return (o2 == null) ? 0 : 1; 
     } 
     if (o2 == null) { 
      return -1; 
     } 

     String username1 = o1.getName(); 
     String username2 = o2.getName(); 
     int namecomp = username1.compareTo(username2); 
     if (namecomp != 0) { 
      return namecomp; 
     } else { 
      Integer useramount1 = o1.getAmount(); 
      Integer useramount2 = o2.getAmount(); 
      return useramount1.compareTo(useramount2); 
     } 
    } 
} 

また、私はあなたのポストにメソッドシグネチャを修正しました。 usernameamountフィールドがNULL可能で、 両方ある場合、あなたはあまりにもそれらに同じ概念を適用することができ

Collections.sort(users, new UserComparator()); 

static class UserComparator implements Comparator<User> { 
    @Override 
    public int compare(User o1, User o2) { 
     if (o1 == null) { 
      return (o2 == null) ? 0 : 1; 
     } 
     if (o2 == null) { 
      return -1; 
     } 

     String username1 = o1.getName(); 
     String username2 = o2.getName(); 
     if (username1 == null) { 
      return username2 == null ? 0 : 1; 
     } 
     if (username2 == null) { 
      return -1; 
     } 

     int namecomp = username1.compareTo(username2); 
     if (namecomp != 0) { 
      return namecomp; 
     } 

     Integer useramount1 = o1.getAmount(); 
     Integer useramount2 = o2.getAmount(); 
     if (useramount1 == null) { 
      return useramount2 == null ? 0 : 1; 
     } 
     if (useramount2 == null) { 
      return -1; 
     } 
     return useramount1.compareTo(useramount2); 
    } 
} 
+0

この機能はJava 7にもありますか? –

+0

いいえ、それはJava 8です。Java 7が必要ですか? – janos

+0

Collections.sort(リスト、Comparator.nullsLast(新しいComparator()))を試しました。 –

0

あなたはこのように、このコンパレータを使用することができます

I'm working on Java 7

再利用可能なソリューションの場合は、 Bean ComparatorGroup Comparatorを使用してください。

  1. BeanComparatorを使用すると、オブジェクト内の任意のプロパティでソートすることができますし、nullがGroupComparatorあなたは、単一のComparatorに複数のComparatorを組み合わせることができます

  2. をソートされている場所を制御することができます。

だから、基本的なロジックは次のようになります。

BeanComparator name = new BeanComparator(User.class, "getName"); 
BeanComparator amount = new BeanComparator(User.class, "getAmount"); 
GroupComparator gc = new GroupComparator(name, amount); 
+0

詳細をお知らせください。 –

+0

@VibhorSrivastava、詳細は何ですか?リンクを読んでコードをダウンロードし、上記の3行を使用してください。これらのクラスのポイントは、どのクラスのプロパティでもソートを行うたびにカスタムコードを書く必要がないためです。 – camickr

関連する問題