2010-02-08 27 views
1

我有一个代码,返回与一个ArrayList 的重复的ArrayList,但似乎它不工作,我在数组中比较所有项目...重复在ArrayList中,比较各个领域的Java

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; 
} 

但我想我做错了什么,因为它不返回任何东西,我知道它有duplictates下这4个标准提前

回答

1

以下是您可以执行此操作的方法。我已经定义了一个基本类ObjectList,它显示了实现equalshashCode的方法。请注意,这假定所有的内部变量都是非空的。如果这些变量可以包含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中,集等)。

+0

谢谢我正在做这个实现,似乎工作正常,另外我知道我错过了很多syntaxis的语言和它的很多功能,谢谢Kevin – cMinor 2010-02-08 16:14:03

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()方法,并将您的字段相等性检查放在那里,而不是一劳永逸。

+0

我该如何提供ObjectList类的hashcode()和equals()我还没有得到它。 我必须创建一个接口吗? public class ObjectList implements Comparator {} etc ... ????? 谢谢 – cMinor 2010-02-08 04:26:30

+0

不,只是重写'equals()'和'hashcode()'方法。无需“扩展”或“实施”任何东西。看看这里的例子,http://www.javapractices.com/topic/TopicAction.do?Id=28。并请尝试学习和理解语言及其功能。拿起一本好书或教程。 – 2010-02-08 05:05:19

2

这不应该编译器 - 如果aSomeObjectsListObject那么它不会有方法get1()get2()

您的逻辑是行不通的,因为你是不是在你的输入List检查每一个元素针对输入List中的其他元素;相反,您正试图检查退货List

此外,这不是检查集合中重复项的真正有效方法。更好的方法是使用HashMap,您可以在大致不变的时间内检查设置成员资格。如果您必须使用List,请先对其进行排序(假设您的对象具有自然排序),并检查相邻成员是否相等。

除了这两个,只需使用List.contains()

+0

也是如此:)。没有注意到。 – 2010-02-08 03:22:06