我是groovy的新手,并试图找到列表中所有子列表的索引。 我试图在java中使用类似Collections.indexOfSubList的东西,但是它给出了异常,说它适用于Lists而不是ArrayLists。
所以我试图定义自己的功能。我发现较长列表中存在的较小列表中的所有元素的所有索引,然后减去结果数组的索引。如果它是1,那么我正在考虑该子索引的索引。
我知道我的逻辑有点扭曲。有人可以用更好,更有效的方式指导。
以下是我的代码:
List list1 = [1,2,3,4,5,6,1,2,3]
List list2 = [1,2]
index1 = list1.findIndexValues {
it == list2[0];
}
index2 = list1.findIndexValues {
it == list2[1];
}
println index1
println index2
result = []
for (int i = 0; i < index1.size(); i++) {
result.add(index2[i]-index1[i]);
}
println result
答案 0 :(得分:0)
编辑: 由于新问题而不再使用Collections
:弹性搜索。
以下代码遍历源列表,创建子列表。它检查子列表以查看它是否以目标列表开头。请参阅下面的断言(例如,索引从0开始):
def listStartsWithSubList = { source, target ->
def result = false
if (source.size() >= target.size()) {
result = true
target.eachWithIndex { item, index ->
result = result && (item == source[index])
}
}
result
}
def indexOfSubLists = { source, target ->
def results = []
source.eachWithIndex { item, index ->
def tmpList = source[index..source.size()-1]
if (listStartsWithSubList(tmpList, target)) {
results << index
}
}
results
}
assert [1] == indexOfSubLists([1,2,3], [2,3])
assert [2] == indexOfSubLists([1,2,3], [3])
assert [] == indexOfSubLists([1,2,3], [4])
assert [0,6] == indexOfSubLists([1,2,3,4,5,6,1,2,3], [1,2])