2015-07-22 2 views
0

У меня есть запись в файле с четырьмя столбцами colA, colB, colC, colD. Мне нужно прочитать этот файл и создать два неизменных сопоставления структуры данных.создать две неизменяемые структуры данных за один раз, используя scala для понимания или любую другую функцию.

colA -> (colB, colC, colD) 
colB -> (colA, colC, colD) 

Есть ли способ, я могу сделать это за один раз. Используя для понимания, я могу создать один массив, и после итерации через него я могу создать два Карты. Но это не кажется правильным и эффективным подходом. Пожалуйста, помогите мне.
Ну, что я делаю, как показано ниже

case class Mapping(col1: String, col2: String, col3: String, col4: String) 
val columnList = for { 
    line <- io.Source.fromInputStream(getClass.getClassLoader.getResourceAsStream(file)).getLines() if (!(line startsWith ("#"))) 
    val splittedArray: Array[String] = line.replaceAll(" ", "").split(",") 
    if (splittedArray.length == 4) 
    } yield Mapping(splittedArray(0), splittedArray(1), splittedArray(2), splittedArray(3)) 
val map1 = columnList.map(mapping=> (mapping.col1, mapping)).toMap 
val map2 = columnList.map(mapping=> (mapping.col2, mapping)).toMap 

ответ

3

Складной является более гибким, чем отображение, так что вы можете использовать fold создать две коллекции сразу:

val v = Vector(
    Vector(1,2,3,4), 
    Vector(5,6,7,8), 
    Vector(9,10,11,12)) 
val (m1, m2) = v.foldLeft((Map.empty[Int,(Int,Int,Int)],Map.empty[Int,(Int,Int,Int)])) { 
    case ((x,y), Vector(a,b,c,d)) => 
    (x + (a -> (b,c,d)), y + (b -> (a,c,d))) 
} 

println(m1) 
// Map(1 -> (2,3,4), 5 -> (6,7,8), 9 -> (10,11,12)) 
println(m2) 
// Map(2 -> (1,3,4), 6 -> (5,7,8), 10 -> (9,11,12))