在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]
如果没有内置方式,是否有传统的替代方案?
答案 0 :(得分:16)
没有内置移位和不移位......以下是一些选项:
您可以使用队列:
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 ]
或者您可以使用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 ]
或者,你可以走得很远:
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
添加到列表的metaClass中:
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 ]
答案 1 :(得分: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]
答案 2 :(得分:3)
JRE方法List.remove(int)和List(int,E)是shift和unshift操作的超集,这使得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