2017-12-05 7 views
1

nameemailを持つことができるオブジェクトがいくつかあります。それらを名前でソートし、電子メールでソートしたいのですが、まずヌル名を持たないユーザーを表示します。私はそのようにしようとしていた:最後にヌルを持つコレクションの比較器

Collections.sort(usersList, new Comparator<User>() { 
      @Override 
      public int compare(User obj1, User obj2) { 
       int res = 0; 

       //to make sure null names at the end 

       if (obj1.getFullName() == null && obj2.getFullName() == null) 
        res = 0; 

       if (obj1.getFullName() == null) 
        res = 1; 

       if (obj2.getFullName() == null) 
        res = -1; 

       //logic for name sorting then email sorting 

       if (obj1.getFullName() != null && obj2.getFullName() != null) 
        res = obj1.getFullName().compareTo(obj2.getFullName()); 

       if (res == 0) 
        res = obj1.getEmail().compareTo(obj2.getEmail()); 

       return res; 
      } 
     }); 

私は最初に名前を取得しますが、名前ではなく電子メールでソートしました。

+3

あなたはおそらく必要はなく、 "IFS" をたくさんよりも "他の場合"。それ以外の場合は、メソッドの一番下にある「ifs」が「勝利」しています。上のものになっていても、それらのifに入ります。あなたはどういう意味ですか? –

+2

1行ブロックのために '{}'を省略するという習慣から抜け出す。あなたは喜んだでしょう。 – slim

答えて

1

これは、簡単にJavaの-8のComparatorユーティリティを使用して行うことができます。

List<User> users = Arrays.asList(new User("pete", "[email protected]"), new User(null, null), new User("alex", null), new User(null, "email")); 

Collections.sort(users, Comparator.comparing(User::getName, Comparator.nullsLast(Comparator.naturalOrder())) 
         .thenComparing(Comparator.comparing(User::getEmail, Comparator.nullsLast(Comparator.naturalOrder())))); 

System.out.println(users); 

出力:

[ 
    User{name='alex', email='null'}, 
    User{name='pete', email='[email protected]'}, 
    User{name='null', email='email'}, 
    User{name='null', email='null'} 
] 
関連する問題