比较Set&列出我的情况

时间:2013-11-05 09:21:58

标签: java performance swing list java-ee

我有List<Integer>,此列表包含重复的元素:

//myList content is something like e.g. 1,2,1,3,3,6,7,...
List<Integer> myList = getNumbers();

我还有一个Set<String>,众所周知,Set只包含唯一的元素,没有重复的元素。我的Set<String>包含String-type-in​​tegers:

//The Set content is String type integer , e.g. "1", "3", "5" …
Set<String> mySet = getNumSet(); 

我想将mySetmyList进行比较,以确定mySet有哪些元素,但myList没有&{从mySet中删除这些元素。

我现在的做法是使用嵌套迭代,如下所示:

for(Integer i : myList){
   for(String s : mySet){
         if(!myList.contains(Integer.valueOf(s))){
               mySet.remove(s);
         }
    }   

}

有没有比我更有效的方法呢?

4 个答案:

答案 0 :(得分:2)

最简单的方法可能是使用Collection#retainAll(Collection<?> c),这可以通过集合类型的功能进行一些优化来实现。

mySet.retainAll(myList)

mySetmyList必须为Set<X>List<X>。我建议您更改mySet的声明并填写Integer#valueOf(String s)之类的内容,然后使用retainAll方法。

答案 1 :(得分:2)

    for (Iterator<String> it = mySet.iterator(); it.hasNext();) {
        if(myList.contains(Integer.parseInt(it.next()))){
            it.remove();
        }
    }

答案 2 :(得分:1)

  1. 复制集。
  2. 遍历列表,删除找到的项目 副本。
  3. 从原始集中减去副本。
  4. 假设您在集合中有 m 个元素,并且列表中有 n 个元素。

    然后从集合中删除项目是 O(log m),并在列表中迭代 O(n)。总体复杂度为 O(n×log m)。减法最多为 O(m×log m),因此总体复杂度为 O(s×log s)其中 s = max(m,n) )

    您的算法的复杂性是 O(n 2 ×(log m) 2 ,因为您

    1. 遍历列表( O(n))和每个项目
    2. 遍历集合( O(log m)),
    3. 在列表中找到相应的项目( O(n)),最后
    4. 如果合适,将其从集合中删除( O(log m))。

答案 3 :(得分:0)

实际上需要更多信息才能找到最佳方法。

如果myList.size()&gt;&gt; mySet.size(),遵循Oswald的解决方案,或

  1. 创建一个新的字符串集。
  2. 对于myList中的每个项目,如果它不在mySet中,请将其保存到newSet。
  3. 调用mySet.removeAll(newSet)。
  4. 如果mySet.size()&gt;&gt; myList.size(),最好的解决方案是将myList转换为新的String字符集,然后调用mySet.retainAll方法。