在 java 中,有什么方法可以只对空白进行排序,最后剩下的根本不进行排序?
is there any way we can sort only blanks go last remaining not sort at all in java?
有什么方法可以让空白值排在最后,而不是空白的值根本不排序。
我有这样的要求
userroles-admin,developer,blank field
我必须将空白排序到最后,如果管理员、开发人员(不是空白)他们不应该排序,它应该考虑最近的未来日期来处理。
我用过的逻辑:
userList
.stream()
.sorted(
Comparator
.Comparing(User::getUserRole, roleComparator)
.thenComparing(user::getJoinedDate, DateComparator))
.collect(Collectors.toList());
所以下面是仅用于空白的自定义比较器,但它甚至对管理员和开发人员也进行了排序。
public class roleComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
if (o1.equals(o2)) {
return 0;
} else if (o1.isBlank()) {
return 1;
}
return -1;
}
}
当我试图对它进行排序时,它没有给出正确的顺序,它应该首先给出角色的空值而不是空值,然后是最近的未来日期,根据此处的输出,它最后采用空值但它采用排序顺序首先是管理员,其次是开发人员,这不应该并给出错误的结果。例如:
1.user("admin","04/30/2022")
2.user("developer","04/28/2022")
3.user("developer","04/31/2022")`
4.user("","04/27/2022")
订单应该是:2134 但它需要 2314
您的问题出在第一行,您正在使用 String.equals 比较字符串,但这不是您想要的。您希望所有“non-blank”字符串都相等
public int compare(String a, String b)
if (a.isBlank()) return 1;
if (b.isBlank()) return -1;
return 0;
}
我使用 lambda 构建 Comparators
。我相信,根据评论,这就是您想要的。
Comparator<String> roleComparator = (o1,o2)->
o1.isBlank() && o2.isBlank() ? 0 :
o1.isBlank() ? 1 : o2.isBlank() ? -1 : 0;
Comparator<User> comp = Comparator.comparing(User::getRole,
roleComparator).thenComparing(
User::getJoinedDate, dateComparator);
您可以将 comp
指定为 sort comparator
。
我使用已知不稳定的 selection sort
对此进行了测试,方法是使用稳定的 (Collections.sort)
和选择排序对列表进行洗牌并比较结果。但是,不稳定的排序并不总是表现出不稳定。
有什么方法可以让空白值排在最后,而不是空白的值根本不排序。 我有这样的要求
userroles-admin,developer,blank field
我必须将空白排序到最后,如果管理员、开发人员(不是空白)他们不应该排序,它应该考虑最近的未来日期来处理。
我用过的逻辑:
userList
.stream()
.sorted(
Comparator
.Comparing(User::getUserRole, roleComparator)
.thenComparing(user::getJoinedDate, DateComparator))
.collect(Collectors.toList());
所以下面是仅用于空白的自定义比较器,但它甚至对管理员和开发人员也进行了排序。
public class roleComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
if (o1.equals(o2)) {
return 0;
} else if (o1.isBlank()) {
return 1;
}
return -1;
}
}
当我试图对它进行排序时,它没有给出正确的顺序,它应该首先给出角色的空值而不是空值,然后是最近的未来日期,根据此处的输出,它最后采用空值但它采用排序顺序首先是管理员,其次是开发人员,这不应该并给出错误的结果。例如:
1.user("admin","04/30/2022")
2.user("developer","04/28/2022")
3.user("developer","04/31/2022")`
4.user("","04/27/2022")
订单应该是:2134 但它需要 2314
您的问题出在第一行,您正在使用 String.equals 比较字符串,但这不是您想要的。您希望所有“non-blank”字符串都相等
public int compare(String a, String b)
if (a.isBlank()) return 1;
if (b.isBlank()) return -1;
return 0;
}
我使用 lambda 构建 Comparators
。我相信,根据评论,这就是您想要的。
Comparator<String> roleComparator = (o1,o2)->
o1.isBlank() && o2.isBlank() ? 0 :
o1.isBlank() ? 1 : o2.isBlank() ? -1 : 0;
Comparator<User> comp = Comparator.comparing(User::getRole,
roleComparator).thenComparing(
User::getJoinedDate, dateComparator);
您可以将 comp
指定为 sort comparator
。
我使用已知不稳定的 selection sort
对此进行了测试,方法是使用稳定的 (Collections.sort)
和选择排序对列表进行洗牌并比较结果。但是,不稳定的排序并不总是表现出不稳定。