2014-11-09 3 views
0

Я работаю с версией Scala Hadoop, и мне нужно заполнить al list предыдущим значением первого поля. Похоже, это сейчас:Scala заполнить пробелы в списке

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) 

Update: У меня есть актеры и фильмы текстовый файл, где мне нужно, чтобы получить его, как это:

[(Actor1, Movie1), (Actor1, видеофильм2), (Actor2, Movie3), (Actor3, видеофильм2), (Actor4, Movie3), (Actor4, Movie1)]

текстовый файл выглядит следующим образом (где | me ans a 'tab', чтобы отличить актера от фильма.) Как вы можете видеть, у актера может быть несколько фильмов, где актер не будет упоминаться перед фильмом.

$, 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 фильтр!.):

вал тест = actors.filter (_ IsEmpty!.) .map (line => line.split ("\ t +"). toList)

И это создаст его, как указано выше, с помощью списков. Я довольно новичок в Scala, поэтому я не знаю, как правильно это сказать.

+0

Что находится в первом элементе списка «Список (, что)»? Nil? Опция? Пустая строка? Всегда ли действительный первый элемент первого из ваших списков? (например, This1) Кроме того, вы сказали «заполните список», но вы даете много списков - есть ли у вас список списков? –

+0

В этом нет ничего. Он отфильтровывается вкладками – Tooltje

+0

Немного неясно. Пожалуйста, уточните, что вы подразумеваете под «Я хочу, чтобы это выглядело так». У вас есть 'List'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Это то, что вы хотите? –

ответ

0

Ваши структуры данных неясны, поэтому я собираюсь предположить некоторые вещи для вас.

У вас есть актер в виде строки, а фильм - как строка. Каждая строка представлена ​​в виде пары (Actor, Movie), и у вас есть список таких пар. В некоторых из пар Актер представляет собой пустую строку "". Вы хотите, чтобы список был нормализован, чтобы пустые строки были заменены актером в предыдущей паре.

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, но вы можете добавить пуля корректуры.

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])) 
Смежные вопросы