scala在列表中填充空格

6ioyuze2  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(458)

我正在使用scalahadoop版本,需要用第一个字段的前一个值填充al list。现在看起来是这样的:

List(This1, that1)

List(, that2)

List(, that3)

List(This2, that4)

List(, that1)

我希望它看起来像这样:

List(This1, that1)

List(This1, that2)

List(This1, that3)

List(This2, that4)

List(This2, that1)

更新:我有一个演员和电影文本文件,我需要这样得到它:
[(演员1,电影1),(演员1,电影2),(演员2,电影3),(演员3,电影2),(演员4,电影3),(演员4,电影1)]
文本文件如下所示(其中|表示区分演员和电影的“选项卡”)。正如您所看到的,演员可以有多部电影,在电影之前不会提及演员。

$, Claw     |   "OnCreativity" (2012)  [Himself]

$, Homo     |   Nykytaiteen museo (1986)  [Himself]  <25>

        |   Suuri illusioni (1985)  [Guests]  <22>

$, Steve    |   E.R. Sluts (2003) (V)  <12>

$hort, Too  |   2012 AVN Awards Show (2012) (TV)  [Himself - Musical Guest]

        |   2012 AVN Red Carpet Show (2012) (TV)  [Himself]

所以我做了这个动作(演员之间也有空行,所以这就是!\。(空筛选器):
val test=actors.filter(!\。isempty).map(line=>line.split(“\t+”).tolist)
这将创建上面的列表。我对scala还很陌生,所以我真的不知道该怎么说。

kiz8lqtg

kiz8lqtg1#

这里有一个解决方案
首先,列出我认为你在拆分后得到的结果:

val t = List(
List("$, Claw", "\"OnCreativity\" (2012)  [Himself]"),
List("$, Homo", "Nykytaiteen museo (1986)  [Himself]  <25>"),
List("", "Suuri illusioni (1985)  [Guests]  <22>"),
List("$, Steve", "E.R. Sluts (2003) (V)  <12>"),
List("$hort, Too", "2012 AVN Awards Show (2012) (TV)  [Himself - Musical Guest]"),
List("", "2012 AVN Red Carpet Show (2012) (TV)  [Himself]"))

然后代码-在 foldLeft ,我们保留了一个到目前为止的结果列表(相反,为了提高效率),以及当前用于填充找到的第一个空条目的值。如果我们得到一个非空的值,我们用非空的第一个条目替换该值,否则我们继续使用它。这个 ._1.reverse 最后,按照正确的顺序从结果中检索修改后的列表。

t.tail.foldLeft((List(t.head), t.head.head)) {
  case ((acc, previous), elem) =>
    val fill = if (elem.head.isEmpty) previous else elem.head
    ((fill :: elem.tail) :: acc, fill)
}._1.reverse 
//> res1: (List[List[String]], String) = (List(
// List($, Claw, "OnCreativity" (2012)  [Himself]),
// List($, Homo, Nykytaiteen museo (1986)  [Himself]  <25>),
// List($, Homo, Suuri illusioni (1985)  [Guests]  <22>),
// List($, Steve, E.R. Sluts (2003) (V)  <12>),
// List($hort, Too, 2012 AVN Awards Show (2012) (TV)  [Himself - Musical Guest]),
// List($hort, Too, 2012 AVN Red Carpet Show (2012) (TV)  [Himself]))
kdfy810k

kdfy810k2#

你的数据结构很模糊,所以我要为你假设一些事情。
演员是一根弦,电影是一根弦。每一行表示为一对(演员、电影),您有一个这样的对的列表。在一些配对中,演员是一个空字符串 "" . 您需要规范化列表,以便将空字符串替换为前一对中的参与者。

def normalizeActorsMovies(in: List[(String, String)]): List[(String, String)] = {
  in match {
    case (actor, movie) :: ("", movie2) :: rest =>
      (actor, movie) :: normalizeActorsMovies( (actor, movie2) :: rest)
    case _ => in
  }
}

如果初始对有一个空的actor字段,那么这样做显然是不对的,但是您可以添加一些防弹措施。

相关问题