如何将文本文件数据转换为Adjucency列表

时间:2016-12-21 13:20:43

标签: scala adjacency-list adjacency-matrix

我有以下图形文本文件,它是我要在scala中转换为邻接列表的大文件。下面给出的文本文件的前几行:

src, dst,dist  
A,C,5.0
A,B,8.0
B,C,6.0
B,D,7.0
B,A,8.0
C,A,5.0
C,B,6.0
D,B,7.0
D,E,8.0
E,D,8.0

我想将其转换为以下格式的adjucency list。

"A"->List((8.0,"B"),(5.0,"C"))

请指导我在scala中将其转换为邻接列表的好方法。

1 个答案:

答案 0 :(得分:1)

由于没有后续行动:

 val zs = """A,C,5.0
A,B,8.0
B,C,6.0
B,D,7.0
B,A,8.0
C,A,5.0
C,B,6.0
D,B,7.0
D,E,8.0
E,D,8.0"""

将字符串解析为Seq of Seq ...

val as = zs.split('\n').toSeq.map(_.split(',').toSeq)

让它成为关键,价值。 Value是一个单元素Seq,因为它使reduceByKey易于使用

val bs = as.map{case Seq(k,v,d) => (k, Seq((v,d)))}.reduceByKey(_ ++ _)
// Map(E -> List((D,8.0)),
//     A -> List((C,5.0), (B,8.0)),
//     B -> List((C,6.0), (D,7.0), (A ,8.0)),
//     C -> List((A,5.0), (B,6.0)),
//     D -> List((B,7.0), (E,8.0)))

(稍微简单化)reduceByKey

implicit class SparkOps[K, V]( xs:Traversable[(K,V)]) {
   def reduceByKey(f:(V,V)=>V)= 
       xs.groupBy(_._1).mapValues{x=>x.unzip._2.reduce(f)}

   }

(“简单化”因为它总是返回一个Map而不是与输入相同的Traversable。)