Welcome everyone

基于一个名单排序对现有存量用户排序

java 汪明鑫 284浏览 0评论

比较简单,直接上代码

入参:存量用户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:不交换位置

转载请注明:汪明鑫的个人博客 » 基于一个名单排序对现有存量用户排序

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz