代码之家  ›  专栏  ›  技术社区  ›  sharon gur

我可以重写确定重复项的散列集方法吗?

  •  1
  • sharon gur  · 技术社区  · 6 年前

    我使用存储JSONObjects的哈希集。 我知道hashset同时使用hashCode()和equals方法来确定对象是否重复。

    检查之后,我可以看到同一个JSONObject返回两个不同的hascodes,即使是equals()和similar()返回true,这基本上意味着JSONObject没有正确地重写hashcode()。

    我知道,如果像Gson或Jackson这样的lib使用不当,我可能会解决这个问题,但我的代码在使用JSONObject和重构所有lib以使用其中一个lib方面投入了大量的精力,这将需要2个多小时。

    我的问题-有没有一种方法可以设置哈希集来决定重复项?

    有点像

    HashSet<JSONObject> hs = new HashSet();
    hs.setDuplicateStrategy((o1, o2) => { o1.similar(o2)});
    

    欢迎任何其他解决方案

    2 回复  |  直到 6 年前
        1
  •  1
  •   biziclop    6 年前

    因为你不能扩展 JSONObject HashSet 不支持其他哈希提供程序(如 TreeSet 对于比较器),简单的解决方案是将其包装在一个类中 hashCode() equals() 是的。

    或使用不同的 Set 实施(例如。 有序树 ).

        2
  •  0
  •   sharon gur    6 年前

    正如@PeterLawrey在评论中建议的那样。

    我想出了一种写树集的方法,它实际上设置了它的逻辑可比方法

    Set<JSONObject> treeSet = new TreeSet<>((o1, o2) -> {
                                int intRes = 0;
                                if(!o1.similar(o2)){
                                    intRes = Math.random() > 0.5 ? 1 : -1;
                                }
                                return intRes;
                            });
    

    Math.random部分是为了确保如果对象不相同,我们不会得到一个非常不平衡的树,因为所有不相同的对象都将位于树的同一侧