2015-05-04 20 views
6

Ich habe einen Klassenbenutzer, der ein boolesches Feld enthält, ich möchte eine Liste von Benutzern sortieren, ich möchte die Benutzer, die das boolesche Feld gleich wahr haben, an der Spitze der Liste und als Ich möchte sie nach ihren Namen sortieren. Hier ist meine Klasse:Vergleichen Sie zwei Objekte nach zwei Kriterien

public class User{ 
    int id; 
    String name; 
    boolean myBooleanField; 
    public User(int id, String name, boolean myBooleanField){ 
     this.id = id; 
     this.name = name; 
     this.myBooleanField = myBooleanField; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     return this.id == ((User) obj).id; 
    } 
} 

Hier ist ein Beispiel zu löschen, was ich will: können sagen, dass ich diese Sammlung von Benutzern haben:

ArrayList<User> users = new ArrayList<User>(); 
users.add(new User(1,"user1",false)); 
users.add(new User(2,"user2",true)); 
users.add(new User(3,"user3",true)); 
users.add(new User(4,"user4",false)); 
Collections.sort(users, new Comparator<User>() { 
    @Override 
    public int compare(User u1, User u2) { 
     //Here i'm lookin for what should i add to compare the two users depending to the boolean field 
     return u1.name.compareTo(u2.name); 
    } 
}); 
for(User u : users){ 
    System.out.println(u.name); 
} 

Ich möchte Benutzer sortieren, dieses Ergebnis zu erhalten :

user2 
user3 
user1 
user4 

Antwort

2

Sie könnten zunächst die Boolean.compare(boolean x, boolean y) Methode verwenden. Und da true Elemente am Anfang des Arrays sortiert sind, würden Sie compare(u2.myBooleanField, u1.myBooleanField) verwenden:

@Override 
public int compare(User u1, User u2) { 
    final int booleanCompare = Boolean.compare(u2.myBooleanField, 
               u1.myBooleanField); 
    if (booleanCompare != 0) { 
     return booleanCompare; 
    } 
    return u1.name.compareTo(u2.name); 
} 
2

Etwas in dieser Richtung vielleicht?

Collections.sort(users, new Comparator<User>() { 
    public int compare(User u1, User u2) { 
     String val1 = (u1.myBooleanField ? "0" : "1") + u1.name; 
     String val2 = (u2.myBooleanField ? "0" : "1") + u2.name; 

     return val1.compareTo(val2); 
    } 
});    
1
if(!u1.myBooleanField && u2.myBooleanField){ 
return 1; 
} else if (!u1.myBooleanField && u2.myBooleanField){ 
return -1; 
} else { 
//Whatever comparator you would like to sort on after sorting based on true and false 
} 

Werfen Sie einen Blick auf das, was die Java compareTo() Methode zurückgibt. In meinem obigen Beispiel sortieren wir zuerst nach true und false, und wenn das myBooleanField für beide Benutzer gleich ist, können Sie basierend auf einer anderen Eigenschaft sortieren.

+0

Ich glaube, Sie sonst bedeuten, wenn (u1.myBooleanField && u2.myBooleanField!) – user3578325

2
if (u1.myBooleanField) { 
    if (u2.myBooleanField) 
     return u1.name.compareTo(u2.name); 
    return -1; 
} else if (u2.myBooleanField) { 
    return 1; 
} else { 
    return u1.name.compareTo(u2.name); 
} 
+0

seine zeigt benutzer1 user4 benutzer2 user3 – user3578325

+0

Hatte die Zeichen geschaltet, sollte jetzt besser sein. –

1

Sie können Collectors.groupingBy verwenden Top-Benutzer vom Rest

Map<Boolean, List<User>> list = users.stream() 
      .collect(
       Collectors.groupingBy(
        Info::getMyBooleanField); 

Wählen Sie oben Benutzer und sie

List<User> topUsers = list.get(true); 
topUsers.sort((u1, u2) -> u1.getName().compareTo(u2.getName())); 

Wählen der übrigen Mitglieder nach Namen sortieren zu trennen und sortieren sie nach Name:

List<User> restUsers = list.get(false); 
restUsers.sort((u1, u2) -> u1.getName().compareTo(u2.getName())); 

Und hier ist die endgültige Liste

topUsers.addAll(restUsers); 
users=(ArrayList<User>)topUsers; 
+0

@ user3578325 Irgendwelche Kommentare lassen mich wissen, ob die obige Lösung für Sie funktioniert? – MChaker