4

オブジェクトには、と呼ばれるRecメンバー変数tagがありStringます。

のを持っている場合、メンバー変数に基づいてリストを重複排除するにはどうListすればよいですか?Rectag

に各値Listが1つだけ含まれていることを確認する必要があります。Rectag

次のようなものですが、トラック数などを維持するための最適なアルゴリズムが何であるかわかりません。

private List<Rec> deDupe(List<Rec> recs) {

    for(Rec rec : recs) {

         // How to check whether rec.tag exists in another Rec in this List
         // and delete any duplicates from the List before returning it to
         // the calling method?

    }

    return recs;

}
4

5 に答える 5

6

一時的にに保存しHashMap<String,Rec>ます。

を作成しますHashMap<String,Rec>Recすべてのオブジェクトをループします。tagそれぞれについて、がのキーとしてすでに存在する場合はHashMap、2つを比較して、どちらを保持するかを決定します。そうでない場合は、それを入れます。

完了すると、HashMap.values()メソッドはすべての固有のRecオブジェクトを提供します。

于 2010-11-03T14:54:12.723 に答える
5

これを試して:

private List<Rec> deDupe(List<Rec> recs) {

    Set<String> tags = new HashSet<String>();
    List<Rec> result = new ArrayList<Rec>();

    for(Rec rec : recs) {
        if(!tags.contains(rec.tags) {
            result.add(rec);
            tags.add(rec.tag);
        }
    }

    return result;
}

これにより、それぞれがタグRecのaに対してチェックされます。Setセットにすでにタグが含まれている場合、それは重複しているため、スキップします。それ以外の場合はRec、結果にを追加し、セットにタグを追加します。

于 2010-11-03T14:54:03.787 に答える
1

がその値に基づいているRec場合、これはより簡単になります。次に、次のように書くことができます。 .equalstag

private List<Rec> deDupe( List<Rec> recs )
{
    List<Rec> retList = new ArrayList<Rec>( recs.size() );
    for ( Rec rec : recs )
    {
        if (!retList.contains(rec))
        {
            retList.add(rec);
        }
    }
    return retList;
 }
于 2010-11-03T14:49:31.943 に答える
0

私はグーグルコレクションでそれをします。以前のタグを記憶する述語でフィルター関数を使用し、以前に存在したタグでRecをフィルターで除外できます。このようなもの:

private Iterable<Rec> deDupe(List<Rec> recs) 
{
    Predicate<Rec> filterDuplicatesByTagPredicate = new FilterDuplicatesByTagPredicate();
    return Iterables.filter(recs, filterDuplicatesByTagPredicate);
}

private static class FilterDuplicatesByTagPredicate implements Predicate<Rec>
{
    private Set<String> existingTags = Sets.newHashSet();

    @Override
    public boolean apply(Rec input)
    {
        String tag = input.getTag();
        return existingTags.add(tag);
    }
}

Listの代わりにIterableを返すようにメソッドを少し変更しましたが、それが重要な場合はもちろん変更します。

于 2010-11-03T14:54:45.750 に答える
0

データをシャッフルする必要がない場合(つまり、小さなオブジェクトの小さなリストがある場合)、次のように実行できます。

private List<T> deDupe(List<T> thisListHasDupes){
    Set<T> tempSet = new HashSet<T>();
    for(T t:thisListHasDupes){
        tempSet.add(t);
    }
    List<T> deDupedList = new ArrayList<T>();
    deDupedList.addAll(tempSet);
    return deDupedList;
}

Setの実装では、一貫性のある有効なequals演算子が必要になることに注意してください。したがって、カスタムオブジェクトがある場合は、それが処理されていることを確認してください。

于 2013-10-18T04:25:50.913 に答える