gpt4 book ai didi

groovy - 如何从列表中获取没有最后一个元素的所有元素?

转载 作者:行者123 更新时间:2023-12-03 13:59:31 25 4
gpt4 key购买 nike

以下Groovy代码

    lines = ['0','1','2','3','4','5']
println lines[1..lines.size()-1]
println lines[1..-1]
println lines[1..<lines.size()-1]
println lines[1..<-1]
println lines[1..<-2]
println lines[1..-2]


产生以下输出:

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4]
[1, 0]
[1, 2, 3, 4, 5]
[1, 2, 3, 4]


由于 -1是列表中最后一个元素的索引,因此前两个是有意义的(Groovy中的范围包括end元素,而不是像Java中其他任何地方一样省略它:-()

第3行是所需的输出(没有第一个和最后一个元素的列表)。

我担心输出#4:为什么我为 [1, 0]得到 1..-1

同样,范围 [1, 2, 3, 4, 5]1..<-2似乎错误。

为什么会这样呢?

最佳答案

我认为,采用除最后一个元素以外的所有元素的最佳方法是使用take方法:

def list = ['a', 'b', 'c']
assert list.take(list.size() - 1) == ['a', 'b']


在size == 1的特殊情况下,它可以正常工作:

def list = ['one']
assert list.take(list.size() - 1) == []


虽然我希望它在大小== 0的情况下引发异常,但是行为并不那么糟糕:

def list = []
assert list.take(list.size() - 1) == []


您还可以使用 list[0..<list.size()-1](您的第三个示例),除了空白列表外,它的行为相同,在这种情况下,它将抛出 ArrayIndexOutOfBoundsException,但我认为它不如 take可读。



另一个可以接受的解决方案是使用 list[0..-2](您的最后一个示例),我认为它看起来更优雅,但是不幸的是,当size == 1时使用 ArrayIndexOutOfBoundsException时,它会中断。



在您的示例中(如果要包括除最后一个元素之外的所有元素,我假设您要使用0作为起始索引,而不是1):

lines[0..lines.size()-1]等同于 lines[0..-1],因为列表的 getAt(Range)方法将使用与 getAt(Integer)相同的方式来处理具有负索引的范围,即访问列表的第 (list.size() + negativeIndex)个元素。因此, list[0..-1]与说“从第一个元素到最后一个元素”相同,并且与复制列表相同。和 list[-1..0]等同于“从最后到第一”,等效于 list.reverse() :)

其他非包含范围示例的问题在于,在列表访问之前正在评估非包含范围,并且它们的评估结果是错误的包含范围。例如, 0..<-2的计算结果为 0..-1,这就是为什么它返回所有元素的原因。 0..<-1的计算结果为 0..0,并且仅返回第一个元素。

请注意,空范围是一种特殊情况。它用 0..<0表示,没有等效的内容(因此Groovy在这里不会做任何魔术转换)。这就是为什么 list[0..<list.size()-1]在size == 1时起作用的原因(范围计算为空范围),而 list[0..-2]则不:)

关于groovy - 如何从列表中获取没有最后一个元素的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10516191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com