我需要一个数据结构,该结构是一个整数列表,但是每次将一个整数添加到它时,它存储的值就是它包含的值的总和加上所添加的值。
例如:
def incrementingList = []
incrementingList.add(5) // now it has 5
incrementingList.add(3) // now it has 5,8
incrementingList.add(2) // now it has 5,8,10
是否有一种时髦的方法可以实现此目的,以便可以像示例中一样使用它?
更新
如果此列表可能包含0,并且最后一个元素为0,那么它应该增加最后一个非0元素怎么办?
最佳答案
您可以使用元编程来定义自定义方法:
List.metaClass.plusAdd = { e ->
delegate.isEmpty() ? delegate.add(e) : delegate.add(delegate.last() + e)
}
def l = []
l.plusAdd(5)
l.plusAdd(3)
l.plusAdd(2)
assert l == [5, 8, 10]
编辑
添加最后一个非零元素的更新:
List.metaClass.plusAdd = { e ->
if(delegate.isEmpty()) {
delegate << e
} else {
def nonZeros = delegate.findAll { it > 0 }
delegate << (nonZeros ? nonZeros.last() + e : e)
}
}
def l = []
l.plusAdd(5)
l.plusAdd(3)
l.plusAdd(2)
assert l == [5, 8, 10]
l = [5, 0]
l.plusAdd(5)
assert l == [5, 0, 10]
l = [1,0]
l.plusAdd(5)
assert l == [1, 0 ,6]