我有一个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)]
,f
是binary 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)))