我有一个带有自定义对象的ArrayList。我想要的是根据自定义对象的name属性从数组中删除重复项。我曾尝试使用Set person = new TreeSet()来完成此操作;但它不起作用。我猜是因为set比较的是地址或其他东西,而不是name属性。因此,我现在尝试使用迭代器,它也不会删除重复项。这就是我得到的;
ArrayList<Person> people = new ArrayList<Person>();
Iterator<Person> iterator = people.iterator();
while (iterator.hasNext()) {
   Person person = iterator.next();
   if (person.getName().equals(iterator.next().getName())) {
       iterator.remove();
   }
}
for (Person person : people) {
    System.out.println(person.getName());
}虽然我在ArrayList中看到了重复的内容,但它没有被修改。我需要些帮助。谢谢!
发布于 2013-05-22 20:03:05
我也遇到了同样的情况,于是我想出了一个使用SortedSet的解决方案。在这种情况下,那些导致Set的比较器返回0的对象将只在Set中插入一次。
下面是一个示例:
SortedSet<Person> persons = new TreeSet<Person>(new Comparator<Person>() {
    @Override
    public int compare(Person arg0, Person arg1) {
        return arg0.getName().compareTo(arg1.getName());
    }
});现在,如果您在persons中插入一个Person,则不会插入重复项(基于其name属性)。
因此,您可以迭代list<Person>并将其中的每一项插入到persons集合中,并确保不会有任何重复项。所以剩下的就像这样:
Iterator<Person> iterator = people.iterator();
while(iterator.hasNext()) {
    persons.add(iterator.next());
}
people.clear();
people.addAll(persons); //Now, your people does not contain duplicate names发布于 2013-05-22 19:59:12
您的代码当前已损坏,因为您只将对象与列表中的下一个对象进行比较。要纠正当前的方法,您需要有另一个子循环来将每个对象与列表中的所有其他对象进行比较。这可能会让嵌套的迭代器变得混乱。
一种替代方法是定义一个新的列表,一旦确认它们不是重复的,就用它们填充。这避免了嵌套迭代器。
最后,另一种选择是定义一个基于此属性进行比较的equals方法,并在Set中抛出对象。也不要忘记hashCode。
发布于 2013-05-22 20:04:14
它不会删除,因为您只是将每个元素与下一个元素进行比较。您可以将名称存储在一个HashSet中,它只能容纳每个字符串中的1个,如果该项的名称已经在集合中,则删除该项。
HashSet<String> seen = new HashSet<String>();
while (iterator.hasNext()) {
     Person p = iterator.next();
     if (seen.contains(p.getName())) {
           iterator.remove();
     } else { 
           seen.add(p.getName());
     }
}https://stackoverflow.com/questions/16691067
复制相似问题