java关于集合自定义排序:根据一个集合的list的顺序排另外一个集合的顺序
最近工作中遇到一个需求大概意思是用户可以自定义的去变换移动某种资源的顺序(即随意变换id集合的顺序)java中是可以用sort去实现的:
User对象:
/**
* 用户唯一标识主键
*/
private String uid;
/**
* 用户名
*/
private String userName;
实现:
public static void setOrderByList(List<String> orderRule, List<User> userList) {
userList.sort((u1, u2) -> {
int i1 = orderRule.indexOf(u1.getUid());
int i2 = orderRule.indexOf(u2.getUid());
return i1 - i2;
});
}
orderRule就是排序的规则 如果排序规则少于userList的size 那多于的会按照原来的先后排在前面,那如果想不在排序规则里面的 排在后面呢 可以这样:
public static void setOrderByList(List<String> orderRule, List<User> userList) {
userList.sort((u1, u2) -> {
int i1 = orderRule.indexOf(u1.getUid());
int i2 = orderRule.indexOf(u2.getUid());
if (i1 != -1) {
i1 = userList.size() - i1;
}
if (i2 != -1) {
i2 = userList.size() - i2;
}
return i2 - i1;
});
用列:
User build = User.builder().userName("userName1").uid("uid1").build();
User build1 = User.builder().userName("userName2").uid("uid2").build();
User build2 = User.builder().userName("userName3").uid("uid3").build();
User build3 = User.builder().userName("userName4").uid("uid4").build();
List<User> userList = new ArrayList<>();
userList.add(build);
userList.add(build1);
userList.add(build2);
userList.add(build3);
System.out.println("自由排序前:");
System.out.println(userList);
List<String> orderRule = Arrays.asList("uid4", "uid1");
OrderByUtils.setOrderByList(orderRule, userList);
System.out.println("自由排序后");
System.out.println(userList);
打印:
自由排序前:
[User(uid=uid1, userName=userName1), User(uid=uid2, userName=userName2), User(uid=uid3, userName=userName3), User(uid=uid4, userName=userName4)]
自由排序后
[User(uid=uid4, userName=userName4), User(uid=uid1, userName=userName1), User(uid=uid2, userName=userName2), User(uid=uid3, userName=userName3)]
如果在业务中频繁用到自由排序,且业务主键相同的情况可以用泛型+反射写一个通用方法,比如业务中主键名都为id则可以
public static <T> void setOrderByList(List<String> orderRule, List<T> list) {
list.sort(((u1, u2) -> {
int i1 = 0;
int i2 = 0;
try {
i2 = orderRule.indexOf(u2.getClass().getMethod("getId").invoke(u2));
i1 = orderRule.indexOf(u1.getClass().getMethod("getId").invoke(u1));
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
e.printStackTrace();
}
if (i1 != -1) {
i1 = list.size() - i1;
}
if (i2 != -1) {
i2 = list.size() - i2;
}
return i2 - i1;
}));
}
实际业务中如果要维护主客态的话 需要将排序规则和用户主题绑定入库!