4

一个Rec对象有一个名为的成员变量tag,它是一个String.

如果我有一个Listof Recs,我如何根据tag成员变量对列表进行重复数据删除?

我只需要确保每个值List只包含一个。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,则比较两者并决定保留哪一个。如果没有,那就放进去。

完成后,该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这会根据一个标签检查每个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);
    }
}

我稍微改变了返回 Iterable 而不是 List 的方法,但是如果这很重要,你当然可以改变它。

于 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 的实现将需要一个一致且有效的等于运算符。因此,如果您有自定义对象,请确保已处理好。

于 2013-10-18T04:25:50.913 回答