Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compare two objects by two criteria [duplicate]

I have a class user which contains a boolean field, I want to sort a list of users, I want the users who have the boolean field equals true to be in the top of the list and than I want sort them by their names. Here is my class :

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

Here is an example to clear what I want : lets say that I have this collection of users :

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

I want to sort users to get this result :

user2
user3
user1
user4
like image 362
user3578325 Avatar asked May 04 '15 23:05

user3578325


2 Answers

You could use the Boolean.compare(boolean x, boolean y) method first. And since true elements are sorted to the beginning of the array, you would use 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);
}
like image 189
mkobit Avatar answered Sep 21 '22 00:09

mkobit


Something along these lines perhaps?

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);
    }
});             
like image 25
Constantin Avatar answered Sep 22 '22 00:09

Constantin