Scala填写List中的空格

时间:2014-11-09 16:49:56

标签: list scala hadoop

我正在使用Scala Hadoop版本,我需要使用第一个字段的先前值填充列表。它现在看起来像这样:

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)

更新: 我有一个演员和电影文本文件,我需要得到它:

[(Actor1,Movie1),(Actor1,Movie2),(Actor2,Movie3),(Actor3,Movie2),(Actor4,Movie3),(Actor4,Movie1)]

文本文件看起来像这样(其中|表示'标签'以区分演员和电影。)正如您所看到的,演员可以拥有多部电影,其中演员将不会在电影之前被提及。

$, 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]

所以我做了这个动作(演员之间也有空行,所以这就是!_。isEmpty过滤器):

val test = actors.filter(!_。isEmpty).map(line =&gt; line.split(“\ t +”)。toList)

这将使用列表创建上面的内容。我对Scala很新,所以我真的不知道该怎么说。

2 个答案:

答案 0 :(得分:0)

您的数据结构含糊不清,因此我将为您假设一些事情。

您将Actor视为字符串,将Movie视为字符串。每一行都表示为一对(Actor,Movie),并且您有一个这样的对的列表。在某些对中,Actor是一个空字符串""。您希望列表标准化,以便空字符串被前一对中的actor替换。

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字段,这显然不会做正确的事情,但你可以添加一些防弹。

答案 1 :(得分:0)

这是一个解决方案

首先,列出了我认为您在拆分后得到的结果:

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]))