如何根据某些条件用另一个列表过滤一个列表?

How to filter a List with another List based on some conditions?

假设我有这段代码可以根据构造函数参数找出列表中的重复项:(我在解析了一些具有重复项的文本文件后得到了这个。)

case class Line(ini: String, name:String, com:String)

val l0 = Line("X", "hello", "some text")
val l1 = Line("", "world", "some text")
val l2 = Line("X", "computer", "")
val l3 = Line("", "hello", "")
val l4 = Line("X", "world", "")
val l5 = Line("", "hello", "some stuff")

val lineList = List(l0,l1,l2,l3, l4, l5)

val dup = lineList.groupBy(_.name).collect { case (x, List(_,_,_*)) => x } // should yield List("hello", "world")

现在我知道哪一个是重复的了。但是我怎样才能再次过滤 lineList 以根据其他一些规则过滤掉重复项?

最后我想要一个没有重复项的列表,但我也想尽可能多地保留属性 inicom 中的信息。这意味着我想保留遵循以下规则之一的副本:

我想知道这是否过于复杂,可能还有另一种方法可以解决这个问题。我想要完成的是一个没有更多重复项的列表,同时保留包含最多信息的重复项。如何解决这个问题?

您可以定义一个 chooseBetterLine 函数来执行您需要的任何两行同名逻辑(我希望我没听错)- 然后在 [= 上使用 reduce 15=]值:

def chooseBetterLine(l1: Line, l2: Line): Line = {
  if (l1.ini.nonEmpty && l2.ini.isEmpty) l1
  else if (l1.com.nonEmpty && l2.com.isEmpty) l1
  else l2
}

val result: Iterable[Line] = lineList.groupBy(_.name).values.map(_.reduce(chooseBetterLine))