Scala 将元素列表转换为tuple5,防止索引越界
我正在尝试从scala列表创建元组:Scala 将元素列表转换为tuple5,防止索引越界,scala,scalding,Scala,Scalding,我正在尝试从scala列表创建元组: .map('path -> ('uri1, 'uri2, 'uri3, 'uri4, 'uri5)) {elems:List[String] => (elems(0), elems(1), elems(2), elems(3), elems(4)) //ouf of bounds! } 但是elems可能有1到5个元素,所以很明显我会遇到索引越界异常 scala/滚烫的方法是什么?我猜正确的方法是迭代从1到5的范围,然后从那里生成元组 当
.map('path -> ('uri1, 'uri2, 'uri3, 'uri4, 'uri5)) {elems:List[String] =>
(elems(0), elems(1), elems(2), elems(3), elems(4)) //ouf of bounds!
}
但是elems
可能有1到5个元素,所以很明显我会遇到索引越界异常
scala/滚烫的方法是什么?我猜正确的方法是迭代从1到5的范围,然后从那里生成元组
当元素不存在时,我希望返回
null
(出于兼容性原因)。这里的方法实际上取决于您的需求
如果仅当elem
中定义了5个元素时才使用Tuple5
,则简单的模式匹配是一种方法(当函数返回选项时,可以在映射后将其展平以获得预期结果):
或者,如果您在获取所有列表大小并使用一些默认值将它们转换为Tuple5之后,您可以:
- 使用如上所示的模式匹配,并处理剩余的5种情况(列表中的0,1,2,3,4个元素)默认缺失值
- 用scala.util.Try和default(即
Try(elem(1)).getOrElse(“”)包装elem(n)
调用
- 将默认值添加到
elem
列表中,以填充缺少的值
下面最后一个选项的示例:
def convert(l: List[String], default : String): (String, String, String, String, String) = {
val defaults = (1 to 5 - l.size).map(_ => default).toList
l ++ defaults match {
case e1 :: e2 :: e3 :: e4 :: e5 :: _ => (e1, e2, e3, e4, e5)
}
}
有一种方法可以在一行中完成,让stringList
成为List[String]
和default
成为一些默认值
new Tuple(stringList.map(_.asInstanceOf[AnyRef]): _*) ++ (stringList.size until 5).map(_ => default)
问题是它不是类型安全的,所以我给了诺伯特一票,因为他的答案是-而且可能更容易阅读。您可以根据需要在列表中填充null:
.map('path -> ('uri1, 'uri2, 'uri3, 'uri4, 'uri5)) {elems:List[String] =>
val padded= elems ++ List.fill(5)(null)
(padded(0), padded(1), padded(2), padded(3), padded(4)) //No ouf of bounds!
}
当elems
包含即3个元素时,您希望返回什么?null
。我忘了提到这一点。如果你问Scala是怎么做的,那么我建议对元组值使用Option
,而不是null
。
.map('path -> ('uri1, 'uri2, 'uri3, 'uri4, 'uri5)) {elems:List[String] =>
val padded= elems ++ List.fill(5)(null)
(padded(0), padded(1), padded(2), padded(3), padded(4)) //No ouf of bounds!
}