Groovy:从arraylist获取子列表的所有出现的索引

时间:2017-11-23 14:06:10

标签: groovy

我是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

1 个答案:

答案 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])