我需要一个数据结构,它是一个整数列表,但每次添加一个整数时,它存储的值是它包含的值加上添加的值的总和。
例如:
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元素递增怎么办?
答案 0 :(得分:3)
您可以使用元编程来定义自定义方法:
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]
答案 1 :(得分:2)
这应该简单而有效
incrementingList.add(incrementingList.last() + 5)
检查是否为空:
incrementingList.add((incrementingList.size() > 0 ) ? incrementingList.last() + 5 : 5)
,
def incrementingList = []
incrementingList.add((incrementingList.size() > 0 ) ? incrementingList.last() + 5 : 5)
incrementingList.add((incrementingList.size() > 0 ) ? incrementingList.last() + 5 : 5)
incrementingList.add((incrementingList.size() > 0 ) ? incrementingList.last() + 5 : 5)
println incrementingList
输出:
[5, 10, 15]
答案 2 :(得分:2)
略有不同的方法:
def addToList(incList, val) {
if (incList.size() > 0) {
incList << incList.last() + val
} else {
incList << val
}
return incList
}
def incList = []
addToList(incList, 3)
addToList(incList, 2)
addToList(incList, 5)
println incList
输出:
[3, 5, 10]
<强>更新强>:
def addToList(incList, val) {
if (incList.size() > 0) {
if (val != 0) {
incList << val + incList.last()
} else {
def addVal = incList.size() > 1 ? (incList[-1] - incList[-2]) : incList[-1]
incList << addVal + incList.last()
}
} else {
incList << val
}
}
def incList = []
addToList(incList, 5)
addToList(incList, 3)
addToList(incList, 0)
addToList(incList, 5)
addToList(incList, 0)
println incList
输出:
[5, 8, 11, 16, 21]
答案 3 :(得分:2)
建议,根据更新请求(据我所知)......
[编辑:&#39;空&#39;案件由“非零”组成。案例,所以可以简化]
new
测试运行:
CREATE DEFINER = `user`@`%` TRIGGER `database`.`RESULT_TABLE_BEFORE_INSERT`
AFTER INSERT ON `RESULT_TABLE` FOR EACH ROW
BEGIN
UPDATE SAMPLE_TABLE st
SET status = 'complete'
WHERE st.client_sampleID = new.sampleID;
END
答案 4 :(得分:1)
添加一个要求,在列表中只填充零,它应该只添加新元素,这是我的建议:
List.metaClass.fill = { n ->
delegate ? delegate.add((delegate.reverse().find { it > 0 } ?: 0) + n) : delegate.add(n)
delegate
}
assert [].fill(1).fill(2).fill(3) == [1, 3, 6]
assert [5, 0].fill(5) == [5, 0, 10]
assert [0, 0].fill(5).fill(5) == [0, 0, 5, 10]
请注意,我在fill()中返回委托,以便您可以按顺序调用它。