0

以下代码使用 List 检查重复项

public List<Person> getGroupMembers() {
        final List<Person> persons = new ArrayList<Person>(groupMembers.size());
        for (GroupMember member : groupMembers) {
            if (member.getPerson() != null && !member.getPerson().isDeleted()) {
                persons.add(member.getPerson());
                for (int i = 0; i < persons.size(); i++) {
                    for (int j = i + 1; j < persons.size(); j++) {
                        if (persons.get(i).equals(persons.get(j))) {
                            persons.remove(j);
                            i = 0;

                        }
                    }
                }
            }
        }
        return persons;
    }

**Now for checking the duplicity I have to use Set Collection and convert it to List 

为此,我进行了如下更改**

public List<Person> getGroupMembers() {
        final List<Person> persons = new ArrayList<Person>(groupMembers.size());
        final HashSet<Person> setPersons = new HashSet<Person> ();
        for (GroupMember member : groupMembers) {
            if (member.getPerson() != null && !member.getPerson().isDeleted()) {
                setPersons.add(member.getPerson());
                persons.addAll(setPersons);
           }
        }
        return persons;
    }

但是上面的代码没有按预期工作,请建议

4

3 回答 3

2

从列表中删除重复项是单行操作:

persons = new ArrayList<Person>(new LinkedHashSet<Person>(persons));

使用 aLinkedHashSet而不是 aHashSet将保留顺序。

当然,您必须final从 的变量声明中删除修饰符persons,但无论如何您都应该这样做,因为它不是必需的,只会产生“代码噪音”。

于 2013-10-22T11:31:42.033 回答
1

您的代码不会消除重复项,因为它只将项目添加到setPersons,但从不检查它是否存在您将要添加到集合(和列表)的人。您还应该一次将一个人添加到列表中,而不是到目前为止您找到的所有人。

添加验证此人不在集合中的代码以解决此问题,如下所示:

Person p = member.getPerson();
if (p != null && !p.isDeleted() && setPersons.add(p)) {
    persons.add(p);
}

注意setPersons.add(p)if条件中如何使用。如果集合中尚未包含该成员,则Set 将add返回true,因此上面的代码确保该人不会被多次添加到列表中。

于 2013-10-22T10:46:56.187 回答
1

您应该致电:

persons.addAll(setPersons);

在你之外:

for (GroupMember member : groupMembers)

这应该可以,但我现在无法测试它。

public List<Person> getGroupMembers() {
    HashSet<Person> setPersons = new HashSet<Person>();

    for (GroupMember member : groupMembers) {
        if (member.getPerson() != null && !member.getPerson().isDeleted()) {
            setPersons.add(member.getPerson());
       }
    }

    return new ArrayList<Person>(setPersons);
}

由于Setextends Collection,您可以将整体传递HashSetArrayList构造函数:

/**
 *  Constructs a list containing the elements of the specified collection,
 *  in the order they are returned by the collection's iterator.
 */
ArrayList(Collection<? extends E> c)

Collections你可以在这里查看官方教程: Oracle: Java Collections

更具体地说:设置实现

于 2013-10-22T10:47:20.370 回答