我有一个代码来返回一个带有ArrayList重复项的arrayList 但似乎它不起作用,我正在比较阵列中的所有项目......
public ArrayList<ObjectList> duplicates(ArrayList<ObjectList> someObjectsList) {
ArrayList<ObjectList> ret = new ArrayList<ObjectList>();
for ( ObjectList aSomeObjectsList: someObjectsList) {
String field1 = aSomeObjectsList.get1();
String field2 = aSomeObjectsList.get2();
String field3 = aSomeObjectsList.get3();
String field4 = aSomeObjectsList.get4();
for (ObjectList someObject : ret) {
if (
field1.trim().equals(someObject.get1())&&
field2.trim().equals(someObject.get2())&&
field3.trim().equals(someObject.get3())&&
field4.trim().equals(someObject.get4())
){
ret.add(aSomeObjectsList);
}
}
}
return ret;
}
但我想我做错了什么因为它没有返回任何东西,我知道它在这4个字段标准下有重复
提前致谢
答案 0 :(得分:3)
for (Object someObject : ret) {
if (
field1.trim().equals(someObject.get1())&&
field2.trim().equals(someObject.get2())&&
field3.trim().equals(someObject.get3())&&
field4.trim().equals(someObject.get4())
){
ret.add(aSomeObjectsList);
}
}
上面的循环不起作用,因为它的大小为零。
你走了,
public Set<ObjectList> duplicates(ArrayList<ObjectList> someObjectsList) {
Set<ObjectList> originals = new HashSet<ObjectList>();
Set<ObjectList> duplicates = new HashSet<ObjectList>();
for ( ObjectList aSomeObjectsList: someObjectsList) {
boolean added = originals.add(aSomeObjectsList);
if(!added){
duplicates.add(aSomeObjectsList);
}
}
return duplicates;
}
如果您的ObjectList
班级具有hashCode()
和equals()
方法的正确实施,这将有效。
免责声明:此实现不会提供有关在提供的列表中复制特定对象的次数的信息。它只会告诉您特定对象是重复的。我认为这是你的真实意图。如果您想要计算,多少次,您必须相应地修改代码。
提示/建议:您应该覆盖equals()
方法并将字段相等性检查放在那里,一劳永逸。
答案 1 :(得分:2)
这不应该编译 - 如果aSomeObjectsList
是Object
,则它没有方法get1()
,get2()
等。
您的逻辑不起作用,因为您没有检查输入List
中的每个元素与输入List
中的其他元素;相反,您正在尝试检查返回List
。
此外,这不是检查集合中重复项的真正有效方法。更好的方法是使用HashMap
,您可以在大致恒定的时间内检查集合成员资格。如果必须使用List
,则先对其进行排序(假设您的对象具有自然顺序)并检查相邻成员是否相等。
除了这两个,只需使用List.contains()
。
答案 2 :(得分:1)
这是一种可以做到这一点的方法。我已经定义了一个基本类ObjectList
,它显示了实现equals
和hashCode
的方法。请注意,这假设所有内部变量都是非空的。如果这些变量可以包含null,那么在计算equals / hashCode时需要检查它。此外,此类中的对象还必须自己正确实现equals / hashCode。
public class ObjectList {
private int h;
private Object obj1;
private Object obj2;
private Object obj3;
private Object obj4;
@Override
public boolean equals(final Object o) {
if (!(o instanceof ObjectList))
return false;
final ObjectList that = (ObjectList) o;
return that.obj1.equals(obj1) && that.obj2.equals(obj2)
&& that.obj3.equals(obj3) && that.obj4.equals(obj4);
}
@Override
public int hashCode() {
// caches the hashcode since it could be costly to recompute every time
// but this assumes that your object is essentially immutable
// (which it should be if you are using equals/hashCode. If this is not
// true and you want to just temporarily use this when doing the duplicate
// test, move the h variable definition from the object level to this method
// and remove this if statement.
if (h != 0)
return h;
h = obj1.hashCode();
h = h * 31 + obj2.hashCode();
h = h * 31 + obj3.hashCode();
h = h * 31 + obj4.hashCode();
return h;
}
}
public Collection<ObjectList> duplicates(
final Collection<ObjectList> someObjectsList) {
final Set<ObjectList> unique = new HashSet<ObjectList>(someObjectsList);
final ArrayList<ObjectList> ret = new ArrayList<ObjectList>(someObjectsList);
for (final ObjectList o : unique) {
ret.remove(o);
}
// The ret list now contains the duplicate instances; instances
// with more than two occurrences will occur multiple times still in
// this list.
return ret;
// If you want a list of unique duplicate instances then, comment out the above
// return and uncomment this one.
// return new HashSet<ObjectList>(ret);
}
对于参数和返回值,使用Collection<ObjectList>
更好,如果可以这样做,那么你可以改变实现(ArrayList,Set等)。