Groovy-奇怪的集合#交叉行为

Groovy-奇怪的集合#交叉行为,groovy,Groovy,我有这样的代码: def a1 = [[1],[2],[3]] def a2 = [[2],[3],[4]] a1.intersect(a2) 结果是: [] 经过一段时间的研究,我发现列表中的元素必须是可比较的。在中,我们可以看到intersect方法的实现。我注意到的第一件事是用于检查列表中对象存在性的集合(TreeSet)(顺便说一句,如果HashSet使用它,效果很好) 我检查了有两个选项用于检查compareTo方法。第一个是将比较委托给另一个类(异常),第二个是哈希代码检查 第一

我有这样的代码:

def a1 = [[1],[2],[3]]
def a2 = [[2],[3],[4]]
a1.intersect(a2)
结果是:

[]
经过一段时间的研究,我发现列表中的元素必须是可比较的。在中,我们可以看到intersect方法的实现。我注意到的第一件事是用于检查列表中对象存在性的集合(TreeSet)(顺便说一句,如果HashSet使用它,效果很好)

我检查了有两个选项用于检查compareTo方法。第一个是将比较委托给另一个类(异常),第二个是哈希代码检查

第一个选项解释了我们的行为。 我们可以看到,在另一种情况下,只有允许比较的对象是可比较的,我们后来得到了异常


我的问题是为什么会这样?文档中缺少关于它的信息(或者我错了吗?)。我遗漏了什么吗?

找不到它

感觉像是对github上的项目做出了巨大的请求贡献,对现有文档/javadoc进行了更改,以使其更加明确

元素必须具有可比性,否则您无法对它们进行比较以检查交叉点,但您是对的文档并不明确

您可以这样编写自己的实现:

Collection.metaClass.equalityIntersect = { Collection other ->
    delegate.findAll { a -> other.find { it == a } }
}

因此,
a1.equalityIntersect(a2)=[[2],[3]]

这一行为已经被引入到了下面的某个地方-没有指出它,可能是
2.4.2
2.4.2
。它曾在
2.2.1
2.4.0
中工作,并在
2.4.6
中中断。。。但是它在
2.4.7
中是固定的

$ groovy -v
Groovy Version: 2.4.7 JVM: 1.8.0_92 Vendor: Oracle Corporation OS: Mac OS X
$ groovy intersect.groovy
[[2], [3]]

对我来说,如何将这种突破性的变化推广到发行版是一个谜。缺少测试?

在检查交叉点时,我真的需要比较元素(使用Comparable)吗?无法使用HashSet而不是TreeSet完成?您可以向集合的元类添加一个方法(请参见编辑的答案)。。。不确定Groovy是否会接受对该方法的更改,因为它会更改现有的功能,但可能值得提出一个问题。我尝试了很少,而且该解决方案也可以工作:List.metaClass.compareTo={Collection other->delegate[0]other[0]}def arr1=[[1]、[2]、[3]、[5]]。Collection{it as compariable}def arr2=[[4]、[2]、[3]、[6]、[5]]。收集{it as compariable}arr1.intersect(arr2)//结果:[[2]、[3]、[5]]它用于返回2.2.1中的预期结果-如果您预期
[[2]、[3]
而不是
[/code>,则可能会破坏它。