Map one value to all values with a common relation

2019-08-07 04:33发布

问题:

Having a set of data:

{sentenceA1}{\t}{sentenceB1}  
{sentenceA1}{\t}{sentenceB2}  
{sentenceA2}{\t}{sentenceB1}   
{sentenceA3}{\t}{sentenceB1}   
{sentenceA4}{\t}{sentenceB2}    

I want to map a sentenceA to all the sentences that have a common sentenceB in Scala so the result will be something like this:

{sentenceA1}->{sentenceA2,sentenceA3,sentenceA4} or  

{sentenceA2}->{sentenceA1, sentenceA3}

回答1:

val lines = List(
  "sentenceA1\tsentenceB1",
  "sentenceA1\tsentenceB2",
  "sentenceA2\tsentenceB1",
  "sentenceA3\tsentenceB1",
  "sentenceA4\tsentenceB2"
)

val afterSplit = lines.map(_.split("\t"))

val ba = afterSplit
  .groupBy(_(1))
  .mapValues(_.map(_(0)))

val ab = afterSplit
  .groupBy(_(0))
  .mapValues(_.map(_(1)))

val result = ab.map { case (a, b) =>
  a -> b.foldLeft(Set[String]())(_ ++ ba(_)).diff(Set(a))
}