GroupBy在scala中使用两个条件

时间:2015-11-05 07:15:06

标签: scala

我有List[(Int,Int)]

对于前。

val a= List((1,2), (3,4), (1,3), (4,2), (5,4), (3,8))

我想执行这样的操作:

使用以下条件获取第一个元素和groupby:

  1. 如果元素的第一个元组在剩余元素的第一个元组中,则包含它
    1. 如果元素的第一个元组在剩余元素的第一个元组中,则包含它
    2. 然后跳过包含的元组和剩余的元组执行相同的过程。 可能的答案:

       val ans= Map((1,2)->List((1,2),(1,3),(4,2)), (3,4)->List(3,4),(5,4),(3,8)) 
      

      我该怎么做?

1 个答案:

答案 0 :(得分:1)

这似乎有效

a.foldLeft(List[((Int, Int), List[(Int, Int)])]())
  {(acc, t) => if (acc.exists (_._2.contains(t)))
                 acc
               else
                 (t,  a.filter(u => u != t && (u._1 == t._1 || u._2 == t._2)))::acc
  }.toMap 
//> res0: scala.collection.immutable.Map[(Int, Int),List[(Int, Int)]] =
// Map((3,4) -> List((5,4), (3,8)),
       (1,2) -> List((1,3), (4,2)))

浏览列表。如果这个元组已经在我们的累加器中,则什么也不做。否则,过滤所有不是当前元组的元组的列表,并与当前元组共享第一个或第二个元素。