Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Groovy列表移位和取消移位_List_Groovy - Fatal编程技术网

List Groovy列表移位和取消移位

List Groovy列表移位和取消移位,list,groovy,List,Groovy,groovy中是否真的没有内置的方法来使用列表进行“移位”和“取消移位”?(ruby和javascript都有)例如: def list = [1,2,3,4,5] firstElement = list.shift println firstElement // 1 println list // [2,3,4,5] list.unshift 1 println list // [1,2,3,4,5] 如

groovy中是否真的没有内置的方法来使用列表进行“移位”和“取消移位”?(ruby和javascript都有)例如:

def list = [1,2,3,4,5]
firstElement = list.shift
println firstElement          // 1
println list                  // [2,3,4,5]

list.unshift 1
println list                  // [1,2,3,4,5]

如果没有内置方式,是否有传统的替代方案?

没有内置换档和取消换档。。。以下是一些选项:

您可以使用队列:

def queue = [ 1, 2, 3, 4, 5 ] as Queue

def firstElement = queue.poll()

assert firstElement == 1
assert queue == [ 2, 3, 4, 5 ]
但是使用
offer
添加回来会添加到错误的结尾,因此请使用
offerFirst

queue.offerFirst( 1 )
assert queue == [ 1, 2, 3, 4, 5 ]
或者您可以使用
堆栈
,但您需要反转列表,以将
1
作为其第一个元素

def stack = [ 1, 2, 3, 4, 5 ].reverse() as Stack

def firstElement = stack.pop()

assert firstElement == 1
assert stack == [ 5, 4, 3, 2 ]

stack.push( 1 )
assert stack == [ 5, 4, 3, 2, 1 ]
或者,你可以走很长一段路:

def list = [ 1, 2, 3, 4, 5 ]

(firstElement, list) = [ list.head(), list.tail() ]

assert firstElement == 1
assert list == [ 2, 3, 4, 5 ]

list.add( 0, 1 )
assert list == [ 1, 2, 3, 4, 5 ]
或者您可以将
shift
unshift
添加到列表的元类中:

List.metaClass.shift = {
    delegate.remove( 0 )
}
List.metaClass.unshift = { val ->
    delegate.add( 0, val )
    delegate
}

def list = [ 1, 2, 3, 4, 5 ]
def firstElement = list.shift()
assert firstElement == 1
assert list == [ 2, 3, 4, 5 ]

list.unshift( 1 )
assert list == [ 1, 2, 3, 4, 5 ]

如果您需要从前面添加和删除,您可能希望在列表中使用Java Deque的实现。这种数据结构特别允许从任意一端进行有效的添加和删除

它具有从一开始添加和删除元素的方法和。和是做同样事情的替代名称

例如:

def list = new ArrayDeque([1, 2, 3, 4, 5])
def firstElement = list.pop()
assert firstElement == 1
list.push(0)
assert list as List == [0, 2, 3, 4, 5]

JRE方法
List.remove(int)
List.add(int,E)
是移位和取消移位操作的超集,这对于groovy来说是微不足道的。没有理由像其他人所提议的那样涉及其他课程

def baseList = ['one', 'two', 'three']

// Unshift operation:
baseList.add(0, 'zero')
assert  ['zero', 'one', 'two', 'three'] == baseList

// Shift operation
assert  'zero' == baseList.remove(0)
assert  ['one', 'two', 'three'] == baseList

(满足stackoverflow编辑的虚拟文本)

对于队列实现,您可以使用offerFirst。谢谢你的详尽回答@RoyTruelove在
报盘上的好消息第一个
:-D用这一点点信息更新了答案:-)祝你好运!什么时候需要在for each循环的外部执行此操作?这看起来像是Bash ism被带入了脚本语言中。我想对数组中的第一个元素与其他元素进行不同的处理。在我的例子中,我有一个“表”,表示为列表列表。第一个列表是我的标题,其余的是数据。我将“移动”标题,处理这些,然后处理我的表格的其余部分啊,这是为了启动循环,比如“假设第一个元素是最大的,然后查看其余的元素是否是较大的”之类的东西吗?对我来说,这是假设第一个元素是“特殊的”(例如标题行),而其余的元素可以被同等对待。这是一个伟大而简单的答案!对我来说,另一个好处是它不需要对Jenkins脚本安全性进行任何更改。