【问题标题】:How to compare Map with List如何比较地图和列表
【发布时间】:2017-05-24 02:41:39
【问题描述】:

抱歉标题,我找不到更好的标题,而且我知道这听起来很混乱。 问题如下:

我有一个 HashMap,如下所示:

Map<String, ClassA> myMap;

另外,我有一个如下所示的列表:

List<ClassB> myList;

ClassB 如下所示:

   public class ClassB{

    //many things

    private String someString;
    //getter
    //setter
    }
}

someString 是关键字符串myMap

我想以最少的迭代次数从地图中删除我在列表myList 中找不到的所有对象,因为这种清理将一直每隔几秒发生一次。

任何算法?模式甚至示例?

谢谢

【问题讨论】:

    标签: java collections hashmap contains


    【解决方案1】:

    看起来你想要retainAll。诀窍是您在地图的keySet() 上调用它,这具有从地图中删除不需要的条目的副作用。

    接下来,您希望保留的元素不在List&lt;ClassB&gt; 中,而是在从ClassB 的每个实例派生的字符串列表中。您可以使用流来执行此操作。

        myMap.keySet()
             .retainAll(myList.stream()
                              .map(ClassB::getSomeString)
                              .collect(toList()));
    

    【讨论】:

      【解决方案2】:

      使用 java 8 流 API,

      Set<String> keySet = new HashSet<>(myMap.keySet());
      myList.forEach(entry -> keySet.remove(entry.getSomeString()));
      keySet.forEach(key -> myMap.remove(key));
      

      就是这样。我刚刚所做的只是从keySet 中删除了列表中的键。然后,我删除了所有剩下的键。这将在O(n) 中运行。

      这将比当前解决方案消耗更少的内存,因为您正在创建一个额外的 Set 而不是 Map

      【讨论】:

      • 检查!myList.contains(key) 采取O(n) 步骤并重复n 次使其成为O(n^2) 这并不理想,因为OP 明确要求一些有效的东西,因为它每隔几秒钟就会发生一次。
      • 嗨,Imesha,比你的帮助,它看起来不错,你知道它是否比每次迭代列表和搜索地图更好吗?
      • 是的,我修好了。感谢所有的cmets。现在我已经优化它以在 O(n) 中运行。
      • 如我所见,现在是正确的。正如你所建议的,它有什么问题?
      • 您的解决方案会占用更多内存,因为它会复制整个密钥集,而不仅仅是所需的条目。
      【解决方案3】:

      您必须至少迭代一次 List&lt;ClassB&gt; myList 才能这样做,但您可以完全通过一次迭代来完成,这使其成为理想的算法。

      创建一个新 Map 并为列表中的每个元素检查它是否在 myMap 中以及是否存在 - 将其添加到您创建的新 Map 中。完成对列表的迭代后,只需分配:myMap = newMap;,就完成了。

      注意:这对于最少的步骤是理想的,但它使用比“就地”算法更多的内存。

      【讨论】:

      • 嗨,我 alfasin 谢谢你的帮助,这听起来不错,除了我需要使用更少的内存和更少的 cpu 时间。实际上我所做的是遍历列表并对地图进行更改而不复制到另一个地图。我在这里寻找的是改进代码
      • @MarwanJaber 您应该检查这两个选项并避免任何“优化”,除非需要。请记住,通过“复制”地图,您实际上只是在复制指向对象的指针,而不是 对象本身,所以除非您有 很多 个对象,例如“优化”不是必需的!
      • @MarwanJaber 两者都很难(有时是不可能的):使用更少的内存和使用更少的 CPU。你需要选择一个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多