在 ArrayList 中创建重复项的列表

链接

我正在使用集合从 ArrayList(从数据库填充)中获取重复项的列表

void getDuplicateHashTest() {
        List<BroadcastItem> allDataStoreItems  = itemsDAO.getAllItems();
        Set<BroadcastItem> setOfAllData = new HashSet<>(allDataStoreItems);
        List<BroadcastItem> diff = new ArrayList<>(setOfAllData);
        allDataStoreItems.removeAll(diff);
}

所以在最后一行,所有不重复的项目都应该从所有项目的列表中删除。

问题是当我打印时allDataStoreItems.size()我得到 0

集合和子列表打印正确的项目数。

我究竟做错了什么?

马可13

正如jacobm回答中已经指出的那样:该Collection#removeAll方法将删除所有出现的特定元素。但是创建列表并remove重复调用的替代方案并不是一个好的解决方案:在 a 上Listremove调用通常具有 O(n) 复杂度,因此找出像这样的重复项将具有二次复杂度。

更好的解决方案是shamsher Khan 在他的回答 (+1!)中已经提到的解决方案:您可以遍历列表,并使用Set.

该解决方案的复杂度为 O(n)。

不清楚您想要列表还是所有重复项集合例如,当输入是 时[1, 2,2,2, 3],结果应该是[2,2]还是只是[2]但是,如果需要,您可以简单地计算重复项列表,并在第二步中使其元素唯一。

下面是一个例子:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

public class FindDuplicatesInList
{
    public static void main(String[] args)
    {
        List<Integer> list = Arrays.asList(0,1,1,1,2,3,3,4,5,6,7,7,7,8);

        List<Integer> duplicates = computeDuplicates(list);

        // Prints [1, 1, 3, 7, 7]
        System.out.println(duplicates);

        // Prints [1, 3, 7]
        System.out.println(makeUnique(duplicates));
    }

    private static <T> List<T> makeUnique(List<? extends T> list)
    {
        return new ArrayList<T>(new LinkedHashSet<T>(list));
    }

    private static <T> List<T> computeDuplicates(List<? extends T> list)
    {
        Set<T> set = new HashSet<T>();
        List<T> duplicates = new ArrayList<T>();
        for (T element : list)
        {
            boolean wasNew = set.add(element);
            if (!wasNew)
            {
                duplicates.add(element);
            }
        }
        return duplicates;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章