Groovy列表移位和不移位

Roy*_*ove 17 groovy list

在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]
Run Code Online (Sandbox Code Playgroud)

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

tim*_*tes 17

没有内置班次和不移位...这里有一些选择:

你可以使用一个队列:

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

def firstElement = queue.poll()

assert firstElement == 1
assert queue == [ 2, 3, 4, 5 ]
Run Code Online (Sandbox Code Playgroud)

但添加回来offer会增加错误的结尾,所以使用offerFirst:

queue.offerFirst( 1 )
assert queue == [ 1, 2, 3, 4, 5 ]
Run Code Online (Sandbox Code Playgroud)

或者你可以使用a Stack,但你需要反转你的列表以获得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 ]
Run Code Online (Sandbox Code Playgroud)

或者,你可以走很远的路:

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 ]
Run Code Online (Sandbox Code Playgroud)

或者你可以添加shiftunshift以列表的元类:

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 ]
Run Code Online (Sandbox Code Playgroud)


Bla*_*ine 7

JRE方法List.remove(int)List.add(int, E)是shift和unshift操作的超集,使这个平凡的时髦。没有理由像其他人提议的那样涉及其他课程。

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
Run Code Online (Sandbox Code Playgroud)

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


ata*_*lor 6

如果需要在前面添加和删除,可能需要为列表使用Java Deque的实现.该数据结构特别允许从任一端进行有效的添加和删除.

它有方法push(),pop()从一开始就添加和删除元素. addFirst()并且removeFirst()是做同样事情的替代名称.

例:

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]
Run Code Online (Sandbox Code Playgroud)