首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java函数从Java列表中删除重复数字

使用Java函数从Java列表中删除重复数字
EN

Stack Overflow用户
提问于 2021-02-08 09:54:26
回答 2查看 161关注 0票数 0

我正在尝试使用java快速代码删除复制,而不使用distinct。

这是我的解决方案:

代码语言:javascript
复制
        public static List<Integer> dropDuplicates(List<Integer> list) {
        return list
                .stream()
                .collect(Collectors.groupingBy(Function.identity()))
                .values()
                .stream()
                .map(v -> v.stream().findFirst().get())
                .collect(toList());
    }

它工作得很好,但元素的顺序改变了。

代码语言:javascript
复制
      List<Integer> list = Arrays.asList(11, 12, 1, 2, 2, 3,12,  4, 13,  4, 13);
       output => [1, 2, 3, 4, 11, 12, 13]

我对java函数式编程有点陌生(也许这是个愚蠢的问题)。是否有任何方法来保持列表元素的顺序,或者其他更好的方法来做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-08 10:07:08

您的问题来自这样一个事实,即Map接口在元素顺序方面没有任何保证。如果您关心订单,则需要确保使用有序的实现(如LinkedHashMap)。以下实现保留了该命令:

代码语言:javascript
复制
public static List<Integer> dropDuplicates(List<Integer> list) {
    return list
            .stream()
            .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.toList()))
            .values()
            .stream()
            .map(v -> v.stream().findFirst().get())
            .collect(Collectors.toList());
}

当然,使用distinct()或欧内斯特的建议将是一种更简单的解决方案。只是想在你目前所做的基础上继续努力。

票数 0
EN

Stack Overflow用户

发布于 2021-02-08 10:11:49

您可以将filter函数与一个谓词一起使用,该谓词跟踪您已经看到的元素:

代码语言:javascript
复制
public <T> Predicate<T> distinct() {
    final Set<T> seen = new HashSet<>();

    return t -> {
        if (seen.contains(t)) {
            return false;
        }

        seen.add(t);
        return true;
    }
}

现在你可以这样做了:

代码语言:javascript
复制
list.stream()
    .filter(distinct())
    .collect(toList());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66099313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档