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

リストからの重複の削除は、1 行の操作です。

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

a のLinkedHashSet代わりに aを使用すると、HashSet順序が保持されます。

もちろんfinal、の変数宣言から修飾子を削除するpersons必要がありますが、必要ではなく、「コードノイズ」を作成するだけなので、とにかく削除する必要があります。

于 2013-10-22T11:31:42.033 に答える
1

あなたのコードは にアイテムを追加するだけなので、重複を排除しませんsetPersonsが、セット (およびリスト) に追加しようとしている人の存在をチェックすることはありません。また、これまでに見つけたすべての人ではなく、一度に 1 人ずつリストに追加する必要があります。

次のように、この問題を解決するために、人物がまだセットに含まれていないことを確認するコードを追加します。

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

setPersons.add(p)状態での使用方法に注意してくださいif。セットにまだメンバーが含まれていない場合はセットがadd返さtrueれるため、上記のコードは、人物がリストに複数回追加されないようにします。

于 2013-10-22T10:46:56.187 に答える