-2

我有一个List[String]. 我想按给定的等价关系对其进行分组:

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

我已经尝试过 method groupBy,但我无法将空字符串放在单独的组中。

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

编辑:我没有指定,但输入类型是真的List[String],不是List[(String, String)]f是 a binary relation,这就是为什么它有 2 个字符串输入,并且预期的返回类型是List[List[String]]

编辑:正如@a​​ndrey-tyukin 所提到的,f它不是等价关系,所以要求“任何等价关系的答案”是无稽之谈。

编辑:一个例子:

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

3 回答 3

1

这个怎么样:

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 
}
于 2021-08-12T08:45:20.933 回答
0

我不确定您想要什么,您的数据似乎是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)))
于 2021-08-12T10:55:02.327 回答
0

groupBy按价值划分,而不是按关系划分。

您需要一个将您的任何等效对象映射到相同值的函数。

于 2021-08-12T07:27:01.620 回答