Java 我可以通过重写哈希集来确定重复吗?

Java 我可以通过重写哈希集来确定重复吗?,java,json,hashset,Java,Json,Hashset,Im使用存储JSONObject的哈希集。 我知道hashset使用hashCode()和equals方法来确定对象是否重复 在检查之后,我可以看到同一个JSONObject返回两个不同的hascodes,即使是equals()和similor()返回true,这基本上意味着JSONObject没有正确地重写hashcode() 我知道,如果我使用像Gson或Jackson这样的lib,我可能会解决这个问题,但我的代码在使用JSONObject方面投入了大量精力,并对所有这些代码进行重构,以使用

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

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

我知道,如果我使用像Gson或Jackson这样的lib,我可能会解决这个问题,但我的代码在使用JSONObject方面投入了大量精力,并对所有这些代码进行重构,以使用其中一个lib,这将花费大量时间

我的问题是,有没有一种方法可以设置一个hashSet来决定重复项

差不多

HashSet<JSONObject> hs = new HashSet();
hs.setDuplicateStrategy((o1, o2) => { o1.similar(o2)});
HashSet hs=newhashset();
hs.setduplicate策略((o1,o2)=>{o1.simular(o2)});

任何其他解决方案都是受欢迎的,因为您不能扩展
JSONObject
,并且
HashSet
不支持替代的散列提供程序(如
TreeSet
使用比较器),简单的解决方案是将其封装在一个类中,该类正确实现
hashCode()
equals()


或者使用不同的
集合
实现(例如
树集
)。

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

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

Set<JSONObject> treeSet = new TreeSet<>((o1, o2) -> {
                            int intRes = 0;
                            if(!o1.similar(o2)){
                                intRes = Math.random() > 0.5 ? 1 : -1;
                            }
                            return intRes;
                        });
设置树集=新树集((o1,o2)->{
intRes=0;
如果(!o1.类似(o2)){
intRes=Math.random()>0.5?1:-1;
}
回报;
});

Math.random部分是为了确保如果对象不相同,我们不会得到一个非常不平衡的树,因为所有不相同的对象都将位于树的同一侧?这意味着我必须将JSONObject包装在我自己的实现Compariable的对象中,对吗?我没有实现您编写的内容,“JSONObjectCompariable”在您的代码中意味着什么?它是一个实现comparable的新对象,并且是它的一个实例吗?如果您能进一步解释您的解决方案,我将不胜感激。对不起,我指的是一个
比较器
,它允许您指定这些对象的比较方式以及它们何时相等。我不知道这是否正是您的意思,但我写了一个答案来说明我的做法和工作原理,如果您认为我的解决方案有任何问题,请随时发表意见,我会在2天内接受您的回答。使用依赖随机的比较器是一个非常糟糕的主意™. 只需选择一致的顺序即可。
TreeSet
的内部树的重新平衡独立于比较器结果,但您可以使用此策略暂时“丢失”一半树*TL;DR*这个随机位是错误的,它破坏了
比较器的契约,并且破坏了
树集
。但是我没有逻辑方法来确定哪个更大,因此替代方法是只返回1;在任何时候,它们都是不相等的,这样树的所有项目都在同一侧,而关于树的事情就是不正确的。我甚至不知道你是从哪里弄来的,但我劝你仔细阅读。有一种合乎逻辑的方法可以确定哪个更大,只需比较它们的
hashCode()
s。(顺便说一句,总是返回
1
和返回随机数一样糟糕。)