比较简单,直接上代码
入参:存量用户userInfos,名单排序 userOrder
出参:排序后的用户列表
private List<UserInfo> reorderUsers(List<UserInfo> userInfos, List<Long> userOrder) {
// 排序索引 (空间换时间)
Map<Long, Integer> userOrderIndexMap = Maps.newHashMap();
for (int i = 0; i < userOrder.size(); i++) {
authorOrderIndexMap.put(userOrder.get(i), i);
}
return userInfos.stream()
.sorted((a, b) -> {
int aIndex = userOrderIndexMap.getOrDefault(a.getUserId(), -1);
int bIndex = userOrderIndexMap.getOrDefault(b.getUserId(), -1);
if (aIndex == bIndex) {
return 0;
}
if (aIndex == -1) {
return 1;
}
if (bIndex == -1) {
return -1;
}
return Integer.compare(aIndex, bIndex);
}).collect(Collectors.toList());
}
如果每次都用indexOf, 查找当前用户在名单排序的第几个位置,时间复杂度比较高
用户量级大,这个排序就越慢
空间换时间,先构建一个用户顺序的map,key就是用户id, value就是用户在名单排序的位置
后面就排就完了,这里需要注意的是Comparator接口返回值的语义:
只需要记住是否想交换位置就行
return 0:不交换位置,不排序
return 1:交换位置
return -1:不交换位置
转载请注明:汪明鑫的个人博客 » 基于一个名单排序对现有存量用户排序
说点什么
您将是第一位评论人!