gpt4 book ai didi

java - 从Java中的列表中删除重复的对象

转载 作者:行者123 更新时间:2023-12-01 20:03:28 26 4
gpt4 key购买 nike

我知道这种问题以前在 stackoverflow 上被问过很多次。但我的问题有点不同,我找不到任何类似的场景,所以在这里发布这个问题

问题:我需要从 ArrayList 中删除重复的对象。我的 arrayList 的结构如下

dataList.add(new ObjectClass("a","b"));
dataList.add(new ObjectClass("c","n"));
dataList.add(new ObjectClass("b","a")); // should be counted as duplicate
dataList.add(new ObjectClass("z","x"));

我需要从上面的列表中删除对象,例如,它将“a,b”和“b,a”的组合视为重复项,并删除所有重复项

我的解决方案:步骤1)重写DataClass类中的equals方法

class DataClass {
String source;
String destination;

DataClass(String src, String dest) {
this.source = src;
this.destination = dest;
}

// getter setter for source and destination variables

@Override
public boolean equals(Object obj) {
System.out.println("inside equals");
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ObjectClass other = (ObjectClass) obj;
if(i.equals(other.getJ())
&& j.equals(other.getI())) {
return true;
} else return false;
}

步骤2)删除重复项的方法

public List<DataClass> removeDuplicates(List<DataClass> dataList) {
List<DataClass> resultList = new ArrayList<DataClass>();

// Convert array list to Linked list
LinkedList<DataClass> linkedList = new LinkedList<DataClass>();
for(DataClass obj: dataList) {
linkedList.add(obj);
}

// Iterate through linked list and remove if values are duplicates
for(int i = 0; i<linkedList.size();i++) {
for(int j = i+1;j<linkedList.size();j++) {
if(linkedList.get(j).equals(linkedList.get(i))) {
linkedList.remove();
}
}
}
resultList.addAll(linkedList);
return resultList;
}

我仍在寻找任何更好的优化解决方案(如果有的话)。提前致谢

更新解决方案:我的 equals 方法需要纠正一些比较逻辑。所以这是我更新的 ObjectClass 而不是 DataClass,包括正确的重写 equals 方法

public class ObjectClass {
String i;
String j;
public ObjectClass(String i, String j) {
this.i = i;
this.j = j;
}
// getters setters
// override hashcode

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ObjectClass other = (ObjectClass) obj;

if((i.equals(other.getJ()) || i.equals(other.getI()))
&& (j.equals(other.getI()) || j.equals(other.getJ()))) {
return true;
} else return false;
}
}

2)修复 equals 方法后,我尝试了下面的removeDuplicate 方法的实现,正如 Janos 提到的,它按预期工作正常

    for(ObjectClass obj: dataList) {
if(!resultList.contains(obj))
resultList.add(obj);
}

非常感谢

最佳答案

这里有几个问题:

class DataClass {
String source;
String destination;

// ...

@Override
public boolean equals(Object obj) {
// ...
ObjectClass other = (ObjectClass) obj;
if(i.equals(other.getJ())
&& j.equals(other.getI())) {
return true;
} else return false;
}

equals 方法将另一个对象转换为 ObjectClass。它应该转换为定义此方法的同一类:DataClass

equals 方法比较 ij 变量,但它们没有在类中的任何地方定义。有目的地

this.iother.jthis.j 相同时,equals 方法将返回 true code> 与 other.i 相同,否则返回 false。换句话说,(a, b) 将等于 (b, a)。但它不会等于它自己。这很奇怪,可能不是您想要的。

<小时/>

removeDuplicates 方法过于复杂。例如,将数组列表转换为链表是不必要的。这是一个更简单的算法:

  • 对于源列表中的每个值
    • 如果结果列表中不存在该值,则将其添加到结果列表中

就是这样。

List<DataClass> result = new ArrayList<>();

for (DataClass item : dataList) {
if (!result.contains(item)) {
result.add(item);
}
}
return result;

这假设 equals 方法的实现是固定的。否则 result.contains 步骤将无法正常工作。

另请注意,result.contains 执行线性搜索:它会检查每个项目,直到找到匹配项。您可以通过使用集合来提高性能。

关于java - 从Java中的列表中删除重复的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47726141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com