最近工作中遇到一个需求大概意思是用户可以自定义的去变换移动某种资源的顺序(即随意变换id集合的顺序)java中是可以用sort去实现的:
User对象:
private String uid;
private String userName;
实现:
public static void setOrderByList(ListorderRule, List 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(ListorderRule, List 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 userList = new ArrayList<>();
userList.add(build);
userList.add(build1);
userList.add(build2);
userList.add(build3);
System.out.println("自由排序前:");
System.out.println(userList);
List 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 staticvoid setOrderByList(List orderRule, List 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; })); }
实际业务中如果要维护主客态的话 需要将排序规则和用户主题绑定入库!



