Java 8 - 基于特定顺序的自定义排序

标签 java sorting java-8 comparator

我想根据用户状态对用户列表进行排序,但顺序必须基于我设置的顺序。

我想设置列表的顺序,

顺序应该是1, 0 , 5。我们还应该牢记订购用户名。

List<User> users = new ArrayList();
         users.add(new User("A", 1));
         users.add(new User("B", 5));
         users.add(new User("C", 0));
         users.add(new User("D", 1));
         users.add(new User("E", 5));
         users.add(new User("F", 0));

这是用户类

public class User {
         private String username;
         private Integer status;
     }

应该是这样的

[
    {
      "username": "A",
      "status": 1
    },
    {
       "username": "D",
       "status": 1
    },
    {
       "username": "C",
       "status": 0
    },
    {
       "username": "F",
       "status": 0
    },
    {
       "username": "B",
       "status": 5
    },
    {
       "username": "E",
       "status": 5
    }
]

我不确定是否可以使用 Comparator.comparing,因为这个既不是升序也不是降序。

最佳答案

一种方法是按照您想要的顺序保存一个列表,并根据其索引对用户进行排序:

final List<Integer> order = Arrays.asList(1, 0, 5);
users.sort(
    Comparator.comparing((User u) -> order.indexOf(u.getStatus()))
              .thenComparing(User::getUsername));

请注意,虽然这种方法对于少量状态(如您目前拥有的)应该是合理的,但如果有大量状态并且您需要对每个状态执行 O(n) 搜索,它可能会减慢排序速度时间。一种性能更好的方法(尽管可以说不是那么圆滑)是使用 map :

final Map<Integer, Integer> order = new HashMap<>();
order.put(1, 0);
order.put(0, 1);
order.put(5 ,2);
users.sort(Comparator.comparing((User u) -> order.get(u.getStatus()))
                     .thenComparing(User::getUsername));

关于Java 8 - 基于特定顺序的自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53255793/

相关文章:

javascript - 如何使用 vue.js 对表格中的日期进行排序

java - 对由整数和字符串组成的数组 (Object[]) 进行排序 - Java

c# - 如何获取字符串的瑞典语排序顺序

java - 如何从动态代理显式调用默认方法?

java - JMonkeyEngine 与 JDK 8

java - 比较 Selenium 中的两个字符串

java - junit中assertTrue的第二个参数可以是字符串吗?

java - 如何防止在 JavaFX 的 TableView 中选择另一行

java.io.File.<init>(File,String) JDK 版本依赖

java - 程序停止尝试读取 Excel 工作簿 (Apache POI)