【问题标题】:Remove duplicates from a Java List [duplicate]从 Java 列表中删除重复项 [重复]
【发布时间】:2020-04-22 22:53:36
【问题描述】:

我想从下面的列表中删除重复项

List<DataRecord> transactionList =new ArrayList<DataRecord>();

DataRecord 是一个类

public class DataRecord {
    [.....]
    private String TUN; 

TUN 应该是唯一的

【问题讨论】:

  • 如果你重写了equalsDataRecord 方法来比较String TUN,你可以使用新的Set&lt;&gt;(transactionList) 来删除重复项。
  • @charkoul 我的回答能解决你的问题吗?
  • @xenteros 我尝试了第一个解决方案,但重复值(基于 TUN)没有删除(我已经使用 size() 方法检查了结果)
  • 他们不会从这个列表中删除。它将创建另一个没有重复项。它在时间复杂度方面效率更高
  • @xenteros 我知道但 noDuplicatesList.size() = transactionList.size()

标签: java list arraylist java-8


【解决方案1】:

有两种可能的解决方案。

第一个是重写equals方法。只需添加:

public class DataRecord {
    [.....]
    private String TUN; 

    @Override
    public boolean equals(Object o) {
        if (o instanceof DataRecord) {
            DataRecord that = (DataRecord) o;
            return Objects.equals(this.TUN, that.TUN);
        }
        return false;
    }

    @Override
    public int hashCode() {
           return Objects.hashCode(TUN);
    }
}

然后,以下代码将删除重复项:

List<DataRecord> noDuplicatesList = new ArrayList<>(new HashSet<>(transactionList));

当您无法覆盖equals方法时,您需要找到一种解决方法。我的想法如下:

  1. 创建一个助手HashMap&lt;String, DataRecord&gt;,其中的键将是 TUN。
  2. values() 集合中创建一个ArrayList

实施:

Map<String, DataRecord> helper = new HashMap<>();
for (DataRecord dr : transactionList) {
    helper.putIfAbsent(dr.getTUN(), dr);
}
List<DataRecord> noDuplicatesList = new ArrayList<>(helper.values());

【讨论】:

  • 如果使用 Java8+,您可以在第二个建议中使用 Map.putIfAbsent(K, V)
  • @t4dohx 说得好
  • @xenteros 第二种方法效果很好。谢谢
猜你喜欢
  • 2014-09-30
  • 2023-03-05
  • 2021-04-02
  • 2016-01-28
  • 2016-10-19
  • 2018-12-04
相关资源
最近更新 更多