Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将元素列表转换为tuple5,防止索引越界_Scala_Scalding - Fatal编程技术网

Scala 将元素列表转换为tuple5,防止索引越界

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的范围,然后从那里生成元组 当

我正在尝试从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的范围,然后从那里生成元组


当元素不存在时,我希望返回
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!
}