我正在使用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很新,所以我真的不知道该怎么说。
答案 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]))