如何根据某些条件用另一个列表过滤一个列表?
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 以根据其他一些规则过滤掉重复项?
最后我想要一个没有重复项的列表,但我也想尽可能多地保留属性 ini
和 com
中的信息。这意味着我想保留遵循以下规则之一的副本:
属性ini
和com
中内容的行优先于所有其他行,意思是:
Line("X", "hello", "some text")
vs Line("", "hello", "some text")
vs Line("", "hello", "")
应该还给第一个
内容在属性com
的行优先于ini
,意思是:
Line("", "hello", "")
vs Line("", "hello", "some text")
应该还给最后一个
属性ini
中有内容的行优先于ini或com中没有内容的行,意思是:
Line("X", "hello", "")
vs Line("", "hello", "")
应该还给第一个
如果两个副本都在 ini
和 com
中有信息,我不关心选择哪个。
我想知道这是否过于复杂,可能还有另一种方法可以解决这个问题。我想要完成的是一个没有更多重复项的列表,同时保留包含最多信息的重复项。如何解决这个问题?
您可以定义一个 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))
假设我有这段代码可以根据构造函数参数找出列表中的重复项:(我在解析了一些具有重复项的文本文件后得到了这个。)
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 以根据其他一些规则过滤掉重复项?
最后我想要一个没有重复项的列表,但我也想尽可能多地保留属性 ini
和 com
中的信息。这意味着我想保留遵循以下规则之一的副本:
属性
ini
和com
中内容的行优先于所有其他行,意思是:Line("X", "hello", "some text")
vsLine("", "hello", "some text")
vsLine("", "hello", "")
应该还给第一个内容在属性
com
的行优先于ini
,意思是:Line("", "hello", "")
vsLine("", "hello", "some text")
应该还给最后一个属性
ini
中有内容的行优先于ini或com中没有内容的行,意思是:Line("X", "hello", "")
vsLine("", "hello", "")
应该还给第一个如果两个副本都在
ini
和com
中有信息,我不关心选择哪个。
我想知道这是否过于复杂,可能还有另一种方法可以解决这个问题。我想要完成的是一个没有更多重复项的列表,同时保留包含最多信息的重复项。如何解决这个问题?
您可以定义一个 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))