假设我们有一个阵列:合并子阵列
def a = [[0], [1], [2], [2, 1], [1, 2], [3, 2], [2, 3], [3],
[4, 3], [3, 4], [4], [5], [6], [8], [10, 7], [7, 10],
[7, 8], [8, 7], [9], [10], [7, 10, 8], [8, 9], [9, 8],
[11, 0], [0, 11]]
然后
def b = reduce(a)
应产生
[ [0, 11], [1, 2, 3, 4], [5], [6], [7,8,9,10] ]
我的逻辑是有一个包含结果的新数组reducedObjects
。将objects
的第一个子数组复制到reducedObjects
,然后检查下一个子数组是否与来自reducedObjects
的子数组具有交集。如果有交集,则从reducedObjects
的子数组和原始子数组中创建一个联合。
def reduce(objects) {
def reducedObjects = new ArrayList()
objects.each { object ->
if (reducedObjects.size() == 0) {
reducedObjects << object
} else {
def isReduced = false
for (int i = 0; i < reducedObjects.size(); i++) {
def equals = false
object.each { it ->
if(reducedObjects[i].contains(it)) {
equals = true
isReduced = true
}
}
if (equals) {
reducedObjects[i] = (object + reducedObjects[i]).unique().sort()
reducedObjects.unique()
}
}
if(!isReduced) {
reducedObjects << object
}
}
}
return reducedObjects.unique()
}
以下功能不正常工作,因为结果是:
[[0, 11], [1, 2, 3, 4], [5], [6], [7, 8, 9, 10], [8, 9]]
的问题是,reducedObjects
有一个子阵[7, 8]
再下一子阵列[9]
。该函数将创建一个新的子阵列,因为没有交集,但是在下一次迭代中,有一个子阵列[8,9],它合并在[7,8]
和[9]
中。
有没有更好的解决方案来做到这一点?或者以某种方式改进这个解决方案?
你的问题是?如果你只是想问它是如何完成的(请求代码),那太宽泛了。显示你的努力到目前为止,并解释问题是什么。 – tnw
现在似乎没有从'a'到'b'的逻辑,除了'b'有唯一的数字,但子数组没有任何上下文/解释 – depperm
@tnw我更新了我的答案。我需要合并所有具有交叉点的子阵列。 –