Scala:按等价关系分组



我有一个List[String]。我想用一个给定的等价关系对它进行分组:

def f(x: String, y: String): Boolean = {
if (x == "" || y == "") {
false
} else {
x == y
}
}

我已经尝试了方法groupBy,但我不能实现空字符串在单独的组。

我更喜欢任何等价关系f(x: String, y: String): Boolean的答案,而不仅仅是这个。

编辑:我没有指定,但输入类型确实是List[String],而不是List[(String, String)],fbinary relation,这就是为什么它有2个字符串输入,预期返回类型是List[List[String]]

编辑:正如@andrey-tyukin所提到的,f不是一个等价关系,所以请求"任何等价关系的答案";是无稽之谈。

编辑:示例:

Input: List("a", "a", "b", "", "")
Output: List(List("a", "a"), List("b"), List(""), List(""))
  • "a"== "a",这就是为什么他们在同一个组
  • 虽然"== ",但f会导致false,因此它们不在同一组

这个怎么样:

val strs = List("a", "", "b", "c", "", "a", "a", "c")
val grps = strs.sorted.foldLeft(Nil: List[List[String]]){ 
case (h::tl, s) if h.head == s && s.nonEmpty => (s::h) :: tl 
case (r, s) => List(s) :: r 
}

groupBy按值划分,不按关系划分

你需要一个函数将任意等价对象映射到相同的值。

我不确定你想要什么,似乎你的数据是List[(String, String)]?

如果是,你可以试试这个

def f(x: String, y: String): Boolean = {
if (x == "" || y == "") {
false
} else {
x == y
}
}
val xs = List(("", ""), ("", "1"), ("1", "1"), ("1", "2"))
val res = xs.groupBy((f _).tupled)
println(res)
// Map(false -> List((,), (,1), (1,2)), true -> List((1,1)))

最新更新