首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据自定义对象属性从arraylist中删除元素

根据自定义对象属性从arraylist中删除元素
EN

Stack Overflow用户
提问于 2013-05-22 19:54:12
回答 4查看 6.3K关注 0票数 5

我有一个带有自定义对象的ArrayList。我想要的是根据自定义对象的name属性从数组中删除重复项。我曾尝试使用Set person = new TreeSet()来完成此操作;但它不起作用。我猜是因为set比较的是地址或其他东西,而不是name属性。因此,我现在尝试使用迭代器,它也不会删除重复项。这就是我得到的;

代码语言:javascript
运行
复制
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中看到了重复的内容,但它没有被修改。我需要些帮助。谢谢!

EN

Stack Overflow用户

回答已采纳

发布于 2013-05-22 20:03:05

我也遇到了同样的情况,于是我想出了一个使用SortedSet的解决方案。在这种情况下,那些导致Set的比较器返回0的对象将只在Set中插入一次。

下面是一个示例:

代码语言:javascript
运行
复制
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集合中,并确保不会有任何重复项。所以剩下的就像这样:

代码语言:javascript
运行
复制
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
票数 10
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16691067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档