2015-05-04 31 views
6

Ho un utente di classe che contiene un campo booleano, voglio ordinare un elenco di utenti, voglio che gli utenti che hanno il campo booleano siano uguali per essere in cima alla lista e che Voglio ordinarli per nome. Qui è la mia classe:Confronta due oggetti con due criteri

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; 
    } 
} 

Ecco un esempio per cancellare quello che voglio: Diciamo che ho questo insieme di utenti:

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); 
} 

voglio ordinare gli utenti per ottenere questo risultato :

user2 
user3 
user1 
user4 

risposta

2

Si potrebbe utilizzare il metodo Boolean.compare(boolean x, boolean y) prima. E dal momento che true elementi sono ordinati per l'inizio della matrice, si usa compare(u2.myBooleanField, u1.myBooleanField):

@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

Qualcosa in questo senso?

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 
} 

Date un'occhiata a ciò che il Java compareTo() metodo restituisce. Nel mio esempio precedente, prima ordiniamo in base a true e false, e quindi, se myBooleanField è uguale per entrambi gli utenti, puoi ordinare in base ad altre proprietà.

+0

Credo che si intende else if (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

suo mostrando user1 user4 user2 user3 – user3578325

+0

Se i segni fossero passati, dovrebbe essere migliore ora. –

1

È possibile utilizzare Collectors.groupingBy per separare migliori utenti dal resto

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

selezionare Home utenti e ordinarli per nome

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

ristretto del resto degli utenti e ordinarli in base nome:

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

Ed ecco l'elenco definitivo

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

@ user3578325 Qualche commento che mi faccia sapere se la soluzione di cui sopra funziona per te? – MChaker