【问题标题】:Compare Set & List in my case在我的情况下比较 Set & List
【发布时间】:2013-11-05 09:21:58
【问题描述】:

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

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

我还有一个Set&lt;String&gt;,众所周知,Set 只包含唯一元素,没有重复元素。我的Set&lt;String&gt; 包含字符串类型整数:

//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);
         }
    }   

}

还有比我更有效的方法吗?

【问题讨论】:

    标签: java performance swing list jakarta-ee


    【解决方案1】:
        for (Iterator<String> it = mySet.iterator(); it.hasNext();) {
            if(myList.contains(Integer.parseInt(it.next()))){
                it.remove();
            }
        }
    

    【讨论】:

    • 将您的 if-statement 更改为 if(!myList.contains(Integer.parseInt(it.next())))
    【解决方案2】:

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

    mySet.retainAll(myList)

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

    【讨论】:

    • 不行!因为List&lt;Integer&gt;Set&lt;String&gt;。他需要使用Iterator
    【解决方案3】:
    1. 复制集。
    2. 遍历列表,从中删除找到的项目 副本。
    3. 从原始集合中减去副本。

    假设集合中有 m 个元素,列表中有 n 个元素。

    然后从集合中删除项目是O(log m),遍历列表是O(n)。总体复杂度为O(n × log m)。减法最多O(m × log m),所以整体复杂度为O(s × log s) 其中s = max(m, n ).

    你的算法的复杂度是O(n2 × (log m)2),因为你

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

    【讨论】:

    • 为什么这样更有效率?
    【解决方案4】:

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

    如果 myList.size() >> mySet.size(),遵循 Oswald 的解决方案,或者

    1. 创建一个新的字符串集。
    2. 对于 myList 中的每个项目,如果它不在 mySet 中,请将其保存到 newSet。
    3. 调用 mySet.removeAll(newSet)。

    如果 mySet.size() >> myList.size(),最好的解决方案是将 myList 转换为新的 String 集合,然后调用 mySet.retainAll 方法。

    【讨论】:

      猜你喜欢
      • 2020-02-24
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 2020-05-24
      相关资源
      最近更新 更多