【问题标题】:Efficiently Comparing Checking Maps inside a list of Objects in Java有效地比较 Java 中对象列表中的检查映射
【发布时间】:2019-09-19 05:09:51
【问题描述】:

所以,我有一个对象,里面有一个 hashmap(当然,还有相应的 getter 和 setter)。

public class ObjA {
   private HashMap<String, Boolean> mymap;
   ...
}

然后,我有另一个类,其中包含这些对象(以及相应的 getter/setter)的列表:

public class ObjB {
   private List<ObjA> list;
   ...
}

然后,第三类CheckerClass 需要检查ObjB 内部的列表中有多少ObjA 具有相同的映射(这意味着每个键具有相同的键和相同的值)。

我最初的想法是:循环list,并将每个ObjA 的映射解析为String。收集Collection 上的所有解析,然后计算重复项。但我想要一些更高效、更优雅的东西:你知道,易于阅读。而且我不确定如何获得它。

【问题讨论】:

  • (1) 只需声明Map,而不是HashMap,特别是如果您想要进行大量检索(TreeMap)可能会更好。 (2)Map&lt;T, Boolean&gt;有一个更好的名字:Set&lt;T&gt;
  • @chrylis 为什么你认为TreeMap 的性能可能比HashMap 有很多检索?

标签: java memory collections hashmap


【解决方案1】:

以下是创建每个唯一地图计数的方法:

list.stream().collect(Collectors.groupingBy(ObjA::getMyMap, Collectors.counting());

这是因为Map.equals 完全符合您的要求:检查键集是否相同并映射到相等的值。

因此,对于每个独特的地图,您可以找到它在列表中出现的次数。或者,如果您特别想知道有多少重复项,请在生成的地图上使用 .values().stream().filter(c -&gt; c &gt; 1).count()

【讨论】:

    【解决方案2】:

    我的意见是将ObjA修改为Comparable对象。你可以这样做:

    public class ObjA implements Comparable<ObjA>{
       private HashMap<String, Boolean> mymap;
       ...
      @Override
      public int compareTo(ObjA o) {
       //overide it by comparing key and value.
      }
    }
    

    CheckerClass。您可以对 ObjA 列表进行排序并计算重复对象。

    Collections.sort(list)

    【讨论】:

      猜你喜欢
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多