我需要一个数据结构,该结构是一个整数列表,但是每次将一个整数添加到它时,它存储的值就是它包含的值的总和加上所添加的值。

例如:

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]

08-05 09:08