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

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


我想设置列表的顺序,


顺序应该是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,因为这个既不是升序也不是降序。


潇潇雨雨
浏览 587回答 3
3回答

月关宝盒

一种方法可能是按照您想要的顺序保存一个列表,并根据其索引对用户进行排序:final List<Integer> order = Arrays.asList(1, 0, 5);users.sort(&nbsp; &nbsp; Comparator.comparing((User u) -> order.indexOf(u.getStatus()))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .thenComparing(User::getUsername));请注意,虽然这种方法对于少数状态(就像您目前拥有的那样)应该是合理的,但如果有大量状态并且您每次都需要执行 O(n) 搜索,它可能会减慢排序速度。一种性能更好的方法(尽管可以说没有那么圆滑)是使用地图: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()))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.thenComparing(User::getUsername));

米琪卡哇伊

如果你不介意在你的项目中使用 Guava,你可以使用Ordering.explicit:users.sort(Ordering.explicit(1, 0, 5).onResultOf(User::getStatus));如果您还想按名称排序,请添加thenComparing:users.sort(Ordering&nbsp; &nbsp; &nbsp; &nbsp; .explicit(1, 0, 5)&nbsp; &nbsp; &nbsp; &nbsp; .onResultOf(User::getStatus)&nbsp; &nbsp; &nbsp; &nbsp; .thenComparing(User::getUsername));

HUWWW

假设1,0和5will 是 的唯一值status,AJNeufeld 在他们的评论中提出了一个极好的观点;他们说您可以使用方程式将每个值映射到升序。在这种情况下,等式将是 的值在(x - 1)^2哪里:xstatususers.sort(Comparator.comparingDouble(user&nbsp;->&nbsp;Math.pow(user.getStatus()&nbsp;-&nbsp;1,&nbsp;2)));如果您要user在调用上述代码段后打印 的内容,您会得到:[用户[用户名=A,状态=1],用户[用户名=D,状态=1],用户[用户名=C,状态=0],用户[用户名=F,状态=0],用户[用户名=B , 状态=5], 用户 [用户名=E, 状态=5]]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java