按两个标准比较两个对象
Compare two objects by two criteria
我有一个 class 用户,它包含一个布尔字段,我想对用户列表进行排序,我希望布尔字段等于 true 的用户位于列表的顶部并且比我想按他们的名字对他们进行排序。
这是我的 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;
}
}
这是一个清除我想要的示例:
可以说我有这个用户集合:
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);
}
我想对用户进行排序以获得此结果:
user2
user3
user1
user4
也许是这样的?
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);
}
});
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
}
看看JavacompareTo()方法是什么returns。在我上面的示例中,我们首先根据 true 和 false 进行排序,然后,如果两个用户的 myBooleanField 相等,您可以根据其他一些 属性.
进行排序
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);
}
您可以使用 Collectors.groupingBy
将热门用户与其他用户区分开来
Map<Boolean, List<User>> list = users.stream()
.collect(
Collectors.groupingBy(
Info::getMyBooleanField);
Select 排名靠前的用户并按姓名排序
List<User> topUsers = list.get(true);
topUsers.sort((u1, u2) -> u1.getName().compareTo(u2.getName()));
其余用户的 Select 并按姓名排序:
List<User> restUsers = list.get(false);
restUsers.sort((u1, u2) -> u1.getName().compareTo(u2.getName()));
这是最终名单
topUsers.addAll(restUsers );
users=(ArrayList<User>)topUsers;
您可以先使用Boolean.compare(boolean x, boolean y)
方法。由于 true
元素被排序到数组的开头,您将使用 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);
}
我有一个 class 用户,它包含一个布尔字段,我想对用户列表进行排序,我希望布尔字段等于 true 的用户位于列表的顶部并且比我想按他们的名字对他们进行排序。 这是我的 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;
}
}
这是一个清除我想要的示例: 可以说我有这个用户集合:
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);
}
我想对用户进行排序以获得此结果:
user2
user3
user1
user4
也许是这样的?
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);
}
});
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
}
看看JavacompareTo()方法是什么returns。在我上面的示例中,我们首先根据 true 和 false 进行排序,然后,如果两个用户的 myBooleanField 相等,您可以根据其他一些 属性.
进行排序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);
}
您可以使用 Collectors.groupingBy
将热门用户与其他用户区分开来
Map<Boolean, List<User>> list = users.stream()
.collect(
Collectors.groupingBy(
Info::getMyBooleanField);
Select 排名靠前的用户并按姓名排序
List<User> topUsers = list.get(true);
topUsers.sort((u1, u2) -> u1.getName().compareTo(u2.getName()));
其余用户的 Select 并按姓名排序:
List<User> restUsers = list.get(false);
restUsers.sort((u1, u2) -> u1.getName().compareTo(u2.getName()));
这是最终名单
topUsers.addAll(restUsers );
users=(ArrayList<User>)topUsers;
您可以先使用Boolean.compare(boolean x, boolean y)
方法。由于 true
元素被排序到数组的开头,您将使用 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);
}