从 groovy 列表中删除第一个(n)项的最简单方法

rv7*_*rv7 5 groovy list

如何从列表中删除第一个元素,在groovy中就位?

在 JS/ruby 中,它是通过shift,shift!方法完成的。

Mat*_*and 10

您可以使用tail专门用于获取“除第一项之外的所有内容”的方法:

groovy:000> [1,2,3,4,5].tail()
===> [2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

这与head(head and tail...有意义) 形成对比,它会给你第一项(与 相同first()):

groovy:000> [1,2,3,4,5].head()
===> 1
groovy:000> [1,2,3,4,5].first()
===> 1

Run Code Online (Sandbox Code Playgroud)

更正:如果“到位”我们的意思是修改原始列表,那么我认为removeAt并且remove是您的朋友,正如另一个答案所建议的那样。

remove/removeAt不返回结果列表(它们返回已删除的元素),这是不幸的,但似乎它们是唯一实际修改列表的人。

尽管应该注意的是,即使remove/removeAt至少对于 ArrayList 实现来说,它也会System.arraycopy在幕后进行操作,这意味着仍然要复制数据。虽然复制可能是在 jvm 上以最快的方式完成的,但仍然是一个复制。

对于您可能一直在寻找的恒定时间删除,您可以例如确保您的列表是 LinkedList 的实例:

  def list = [1,2] as LinkedList 
  list.remove(0)
Run Code Online (Sandbox Code Playgroud)

此时第一个元素在恒定时间内“取消链接”,无需复制任何数据。


sha*_*678 2

尝试removeAt(0)remove(0)

removeAt()的文档中:

通过删除此列表中指定位置的元素来修改此列表。返回被移除的元素。本质上是 List#remove(int) 的别名,但 List<Integer> 没有歧义。

def lst = [1, 2, 3]
println lst
lst.removeAt(0) // or lst.remove(0)  
println lst
Run Code Online (Sandbox Code Playgroud)

输出:

[1, 2, 3]
[2, 3]
Run Code Online (Sandbox Code Playgroud)