前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试官:List去重有几种方式?

面试官:List去重有几种方式?

作者头像
灬沙师弟
发布2023-12-11 17:30:30
1950
发布2023-12-11 17:30:30
举报
文章被收录于专栏:Java面试教程Java面试教程

在Java开发中,对List集合进行去重是一项基本的任务,而在实际应用中,List中的元素可能是复杂对象,因此需要考虑对对象属性进行去重的情况。本文将综合介绍Java List集合去重的几种方式,包括简单元素和对象属性的去重方法。

使用Set实现简单元素去重

对于List中包含的简单元素,可以使用Set来实现去重。

代码语言:javascript
复制
List<String> originalList = Arrays.asList("apple", "banana", "orange", "apple", "banana");
Set<String> uniqueSet = new LinkedHashSet<>(originalList);
List<String> deduplicatedList = new ArrayList<>(uniqueSet);

这种方式适用于对简单数据类型的List进行去重,但不适用于复杂对象。

使用Java 8的Stream API实现简单元素去重

Java 8引入的Stream API提供了一种简洁的去重方式。

代码语言:javascript
复制
List<String> originalList = Arrays.asList("apple", "banana", "orange", "apple", "banana");
List<String> deduplicatedList = originalList.stream().distinct().collect(Collectors.toList());

这种方式对于简单元素的去重更为简便。

使用Set实现对象属性去重

如果List中的元素是对象,而且对象已正确实现了equalshashCode方法,可以直接使用Set进行对象属性的去重。

代码语言:javascript
复制
public class Fruit {
    private String name;

    // constructor, getters, setters

    @Override
    public boolean equals(Object o) {
        // implement equals based on attributes
    }

    @Override
    public int hashCode() {
        // implement hashCode based on attributes
    }
}

List<Fruit> originalList = Arrays.asList(
        new Fruit("apple"),
        new Fruit("banana"),
        new Fruit("orange"),
        new Fruit("apple"),
        new Fruit("banana"));

Set<Fruit> uniqueSet = new LinkedHashSet<>(originalList);
List<Fruit> deduplicatedList = new ArrayList<>(uniqueSet);

使用Java 8的Stream API实现对象属性去重

利用Stream API,可以通过对象的属性进行去重。

代码语言:javascript
复制
List<Fruit> originalList = Arrays.asList(
        new Fruit("apple"),
        new Fruit("banana"),
        new Fruit("orange"),
        new Fruit("apple"),
        new Fruit("banana"));

List<Fruit> deduplicatedList = originalList.stream()
        .distinct()
        .collect(Collectors.toList());

这里假定Fruit类实现了equalshashCode方法。

使用自定义方法实现对象属性去重

自定义方法可以针对对象属性进行去重。

代码语言:javascript
复制
public class FruitUtils {
    public static List<Fruit> deduplicateByProperty(List<Fruit> originalList, Function<Fruit, ?> propertyExtractor) {
        Map<Object, Boolean> seen = new HashMap<>();
        return originalList.stream()
                .filter(fruit -> seen.putIfAbsent(propertyExtractor.apply(fruit), Boolean.TRUE) == null)
                .collect(Collectors.toList());
    }
}

List<Fruit> originalList = Arrays.asList(
        new Fruit("apple"),
        new Fruit("banana"),
        new Fruit("orange"),
        new Fruit("apple"),
        new Fruit("banana"));

List<Fruit> deduplicatedList = FruitUtils.deduplicateByProperty(originalList, Fruit::getName);

这种方式允许根据具体需求提供属性提取器,使得去重逻辑更加灵活。

总结

在处理List集合去重时,选择合适的方法取决于元素的类型以及具体的需求。使用Set、Stream API或自定义方法都是可行的方式,而针对对象属性的去重需要确保对象正确实现了equalshashCode方法,或者使用自定义方法提取属性进行去重。选择适合项目需求和数据结构的方式,有助于编写更高效、可维护的代码。

我是了不起
和我一起学习更多精彩知识!!!
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java面试教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用Set实现简单元素去重
  • 使用Java 8的Stream API实现简单元素去重
  • 使用Set实现对象属性去重
  • 使用Java 8的Stream API实现对象属性去重
  • 使用自定义方法实现对象属性去重
  • 总结
    • 我是了不起
      • 和我一起学习更多精彩知识!!!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档