除了Kotlin中的最后一个元素外,对列表中的元素求和的最干净的方法是什么?

除了Kotlin中的最后一个元素外,对列表中的元素求和的最干净的方法是什么?,kotlin,functional-programming,Kotlin,Functional Programming,这个问题主要是出于好奇,而且因为我对函数式习惯用法几乎没有触及表面。我有一个Ints列表,其中最后一个是校验和,因此为了验证它,我需要将所有其他的校验和加在一起。到目前为止,我得出了以下结论: val checksum = list.dropLast(1).sum() 有可能做得更好吗?可能类似的事情这也可能有效;在选择元素与删除元素方面: val checksum = list.takeWhile{ list.indexOf(it) < list.lastIndex }.sum()

这个问题主要是出于好奇,而且因为我对函数式习惯用法几乎没有触及表面。我有一个
Int
s列表,其中最后一个是校验和,因此为了验证它,我需要将所有其他的校验和加在一起。到目前为止,我得出了以下结论:

val checksum = list.dropLast(1).sum()

有可能做得更好吗?

可能类似的事情这也可能有效;在选择元素与删除元素方面:

val checksum = list.takeWhile{ list.indexOf(it) < list.lastIndex }.sum()

什么更适合只取决于以后是否还需要将该列表用于其他用途。

为什么不安排校验和,以便在与其他校验和相加时,它给出0或某个大数字的倍数?  (你可以简单地求和或求和。 奇偶校验和校验位通常是这样做的。)  然后你可以直接对整个列表求和并检查结果。是的,我可以对最后一个元素的符号求反,这样一个完整的和将得到0。这个主意很酷。在我的例子中,它是有效的,因为我实际上使用的是一个总是可变的
数组,但是如果我有一个不可变的
列表
,我需要复制一个。列表的元素应该是同质的。在您的例子中,虽然这适用于元素的类型,但不适用于它们的语义。因此,你必须停止过早折叠。我将创建一个元组/记录来将校验和与整数分开。@MartinZeitler您的第一个示例如何处理最后一项与前面一项重复的情况?  (我认为它也有非常糟糕的算法复杂性。)@gidds这不是问题,也不是要求;使用a将消除重复项。使用范围也是一种选择。。。
.减号()
的巧妙之处在于,可以将其应用于列表以及结果的和值(这样就可以更改链中的顺序,仍然可以得到相同的结果)。@rdxdk通常的模式是创建一个序列(从列表或任何内容),然后将操作应用于该序列。  在本例中,没有Sequence.dropLast()方法;但有,也有。  我可能会看一些类似于
list.asSequence().take(list.size-1.sum()
)的东西。问题仅限于
Int
,其中
-
解决方案(为什么将其写为
.减
?)应该是正确的。但是,对于浮点类型,这是不起作用的,例如,考虑<代码> Listof(0,双:PosithViel无穷)。@ MartinZeitler“这不是问题,也不是要求”我想你误解了GIDDS的观点。在
val list=listOf(1,1)
上尝试您的第一个解决方案;它是否给出与list.dropLast(1.sum()
相同的结果?
val checksum = list.sum().minus(list.last())