更新时间:2023-02-13 22:18:31
你可以尝试一套,但你需要声明自己的元组,使其工作。
You could try it with a set, but you need to declare your own tuple class to make it work.
case class MyTuple[A](t: (A, A)) {
override def hashCode = t._1.hashCode + t._2.hashCode
override def equals(other: Any) = other match {
case MyTuple((a, b)) => a.equals(t._1) && b.equals(t._2) || a.equals(t._2) && b.equals(t._1)
case _ => false
}
}
val input= List(("A","B"),
("C","B"),
("B","A"))
val output = input.map(MyTuple.apply).toSet.toList.map((mt: MyTuple[String]) => mt.t)
println(output)
编辑:
Travis的答案让我意识到有一个更好的方法来做到这一点。这就是通过编写一个distinctBy方法来模拟sortBy。
edit: Travis's answer made me realise that there is a nicer way to do this. And that is by writing a distinctBy method that works analog to sortBy.
implicit class extList[T](list: List[T]) {
def distinctBy[U](f: T => U): List[T] = {
var set = Set.empty[U]
var result = List.empty[T]
for(t <- list) {
val u = f(t)
if(!set(u)) {
result ::= t
set += u
}
}
result.reverse
}
}
println(input.distinctBy { case (a, b) => Set((a,b), (b,a)) })