在 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) 和选择排序对列表进行洗牌并比较结果。但是,不稳定的排序并不总是表现出不稳定。