Scala:从元组数组/ RDD获取第n个元素的和

莫希特

我有这样的数组tuple

val a = Array((1,2,3), (2,3,4))

我想为如下方法编写通用方法:

def sum2nd(aa: Array[(Int, Int, Int)]) = {
      aa.map { a => a._2 }.sum
      }

所以我正在寻找一种类似的方法:

def sumNth(aa: Array[(Int, Int, Int)], n: Int)
特拉维斯·布朗

有几种方法可以解决此问题。最简单的是使用productElement

def unsafeSumNth[P <: Product](xs: Seq[P], n: Int): Int =
  xs.map(_.productElement(n).asInstanceOf[Int]).sum

然后(注意,索引从零开始,所以n = 1给了我们第二个元素):

scala> val a = Array((1, 2, 3), (2, 3, 4))
a: Array[(Int, Int, Int)] = Array((1,2,3), (2,3,4))

scala> unsafeSumNth(a, 1)
res0: Int = 5

但是,此实现可能以两种不同的方式在运行时崩溃:

scala> unsafeSumNth(List((1, 2), (2, 3)), 3)
java.lang.IndexOutOfBoundsException: 3
  at ...

scala> unsafeSumNth(List((1, "a"), (2, "b")), 1)
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
  at ...

也就是说,如果元组没有足够的元素,或者您要的元素不是Int

您可以编写一个在运行时不会崩溃的版本:

import scala.util.Try

def saferSumNth[P <: Product](xs: Seq[P], n: Int): Try[Int] = Try(
  xs.map(_.productElement(n).asInstanceOf[Int]).sum
)

接着:

scala> saferSumNth(a, 1)
res4: scala.util.Try[Int] = Success(5)

scala> saferSumNth(List((1, 2), (2, 3)), 3)
res5: scala.util.Try[Int] = Failure(java.lang.IndexOutOfBoundsException: 3)

scala> saferSumNth(List((1, "a"), (2, "b")), 1)
res6: scala.util.Try[Int] = Failure(java.lang.ClassCastException: ...

这是一个改进,因为它迫使呼叫者解决失败的可能性,但这也很烦人,因为它迫使呼叫者解决失败的可能性。

如果您愿意使用Shapeless,则可以两全其美:

import shapeless._, shapeless.ops.tuple.At

def sumNth[P <: Product](xs: Seq[P], n: Nat)(implicit
  atN: At.Aux[P, n.N, Int]
): Int = xs.map(p => atN(p)).sum

接着:

scala> sumNth(a, 1)
res7: Int = 5

但是坏的甚至不编译:

scala> sumNth(List((1, 2), (2, 3)), 3)
<console>:17: error: could not find implicit value for parameter atN: ...

但是,这仍然不是完美的,因为这意味着第二个参数必须是文字数字(因为它需要在编译时知道):

scala> val x = 1
x: Int = 1

scala> sumNth(a, x)
<console>:19: error: Expression x does not evaluate to a non-negative Int literal
       sumNth(a, x)
                 ^

不过,在许多情况下这不是问题。

总结:如果您愿意为合理的代码崩溃负责,请使用productElement如果您想要更高的安全性(以不便为代价),请productElement与结合使用Try如果您希望编译时安全(但有一些限制),请使用Shapeless。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Scala从数组/ RDD中选择第n个元素中的第n个元素

来自分类Dev

在Scala中,如何将具有n个元素的数组转换为元组数组?

来自分类Dev

scala:处理元组,其中元组的第二个元素是字符串数组

来自分类Dev

如何在scala中获取元组数组的总和

来自分类Dev

Scala排序列表并获取第n个元素

来自分类Dev

如何在JavaScript中获取数组的第n个元素?

来自分类Dev

OCaml:提取元组的第n个元素?

来自分类Dev

如何在Scala中将第n个和第(n + 1)个元素折叠到新列表中?

来自分类Dev

分组数组的第n个元素

来自分类Dev

Javascript:采用数组的第n个元素

来自分类Dev

Javascript:采用数组的第n个元素

来自分类Dev

Javascript映射数组的第n个元素

来自分类Dev

分组数组的每个第n个元素

来自分类Dev

获取输入数组的第n个键值

来自分类Dev

如何在Haskell元组中访问第n个元素

来自分类Dev

如何从元组中删除第n个元素?

来自分类Dev

如何在Haskell元组中访问第n个元素

来自分类Dev

Scala 中的列表和元组

来自分类Dev

火花等级-基于Scala的RDD元组的第二和第三元素

来自分类Dev

仅获取json数组中的第4个元素

来自分类Dev

仅获取json数组中的第4个元素

来自分类Dev

PHP - 如何获取数组的第 n 个(第一个、第二个等)键和值?

来自分类Dev

将RDD元组的第二个元素转换为数组

来自分类Dev

从元组数组中获取numpy数组

来自分类Dev

Swift:从元组数组中获取元素数组

来自分类Dev

使用jQuery使用数组的第n个值填充第n个form元素

来自分类Dev

如何从数组末尾删除第n个元素

来自分类Dev

如何在PHP中访问数组的第N个元素

来自分类Dev

Python删除数组中的每个第n个元素

Related 相关文章

热门标签

归档