2016-08-19 87 views
1

比方说,我有这样的代码要弄清楚的DUP基于构造函数的参数列表:(我结束了这个解析其中有重复一些文本文件后)。如何基于某些条件过滤列表与另一个列表?

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来根据其他规则过滤掉dups?

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

  • 线与内容财产inicom优先于所有其他人,这意味着: 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", "")应归还第一

  • 的情况下,两个副本在inicom有信息,我不不关心选择哪一个。

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

回答

0

可以定义一个chooseBetterLine功能,做你需要的任何两行具有相同名称的逻辑(我希望我正确地跟着它) - 然后在使用reduce

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)) 
+0

真棒!简短而且非常易于理解。 – User1232187

相关问题