实现递增整数列表的Grooviest方法是什么?

时间:2016-02-09 15:31:32

标签: data-structures groovy

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

例如:

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元素递增怎么办?

5 个答案:

答案 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()中返回委托,以便您可以按顺序调用它。