Scala filter tuples (x, y) == (y, x)

后端 未结 3 1098
死守一世寂寞
死守一世寂寞 2021-01-26 13:30

I have a list of tuples, for example:

  (0,2)
  (0,5)
  (2,0)
  (2,5)
  (3,4)
  (4,3)
  (5,0)
  (5,2)

There are some tuples where (x, y)

3条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-01-26 14:02

    Using foldLeft

    var ts = List((0,2),  (0,5),  (2,0), (2,5),  (3,4), (4,3), (5,0), (5,2))  
    
    ts.foldLeft(List[(Int,Int)]())
       {(acc, el) => if ((acc contains el) || (acc contains el.swap)) acc else el::acc}
    // List[(Int, Int)] = List((3,4), (2,5), (0,5), (0,2))
    

    Or, with Sets for an O(n) version (assuming Set lookup and additions are O(1))

    ts.foldLeft(Set[(Int,Int)]()){(acc, el) => if (acc(el.swap)) acc else acc + el}
    

    If it doesn't matter if we re-order ones where the swapped tuple is not present (I'm guessing it doesn't as you don't specify which of the ones that have a swapped tuple should be kept):

    ts.map{t => if (t._1 < t._2) t else t.swap}.distinct
    // List[(Int, Int)] = List((0,2), (0,5), (2,5), (3,4))
    

提交回复
热议问题