0

我在 Scala 中有以下列表,我想根据一个条件进行过滤,这样如果有任何具有重复第一个值的元组,就像下面的示例一样,我想排除

List((a,1), (a,2)) 

因为它有“a”作为重复。

4

4 回答 4

5

您想result使用仅保留那些没有重复“键”的列表的功能来过滤您的

result filter noDuplicateKeys

此过滤函数必须采用对列表,List[(A,B)]并且仅当对第一个元素不存在于所有元素的其他地方时才返回 true,并且可以实现为

def noDuplicateKeys[A, B](xs: List[(A, B)]) = 
    (xs groupBy (_._1)).values forall {_.size < 2}

它将元素分组到 aMap中,其键是s,其值是与该键配对A的 s 的对应列表。B

从此值中,您只能接受大小不超过 1 的值

于 2012-10-29T14:02:44.207 回答
1

我相信下面的代码会做你想做的事(只删除第一对,对吧?):

我正在使用模式匹配来做到这一点,如果您想过滤所有内容,您可以对您的列表进行递归或执行 Kyle 建议的操作。看一下这个:

val a = "a"                                      
val b = "b"                                     

var result =
    List(
      List(),
      List((a, 1), (a, 2)),
      List((a, 1), (b, 1)),
      List((a, 1), (b, 2)),
      List((a, 2), (b, 1)),
      List((a, 2), (b, 2)),
      List((b, 1), (b, 2)),
      List((a, 1), (a, 2), (b, 1)),
      List((a, 1), (a, 2), (b, 2)),
      List((a, 1), (b, 1), (b, 2)),
      List((a, 2), (b, 1), (b, 2)),
      List((a, 1), (a, 2), (b, 1), (b, 2))) 

val filteredResult = (for (list <- result)
    yield list match {
    case x :: y :: xys if (x._1 == y._1) =>  xys
    case _ => list
  }).distinct

结果:

//> List()
//| List((a,1), (b,1))
//| List((a,1), (b,2))
//| List((a,2), (b,1))
//| List((a,2), (b,2))
//| List((b,1))
//| List((b,2))
//| List((a,1), (b,1), (b,2))
//| List((a,2), (b,1), (b,2))
//| List((b,1), (b,2))

distinct 只会过滤生成的空列表。

干杯!

于 2012-10-29T13:45:18.743 回答
1

我认为这是过滤掉 List[List[Tuple2[Char, Int]]] 列表元素具有相同元素的项目。在这种情况下,当元素相同时List[Tuple2[Char, Int]],我想返回列表中的一个Boolean元素。这List[Tuple2[Char, Int]]被映射到 的第一个元素,Tuple然后使用 distinct 和 size 将逻辑应用于新的字符列表,以检查元素是否相同并保留那些只有一个元素的元素。

过滤器

filter(xs => xs.map(ys => ys._1).distinct.size != 1 || xs.size == 1)

测试数据:

scala> val a = List(List(('a',1)))
a: List[List[(Char, Int)]] = List(List((a,1)))

scala> val aa = List(List(('a',1),('a',1)))
aa: List[List[(Char, Int)]] = List(List((a,1), (a,1)))

scala> val ab = List(List(('a',1),('b',1)))
ab: List[List[(Char, Int)]] = List(List((a,1), (b,1)))

scala> val aba = List(List(('a',1),('b',1),('a',1)))
aba: List[List[(Char, Int)]] = List(List((a,1), (b,1), (a,1)))

测试用例。

scala> a.filter(xs => xs.map(ys => ys._1).distinct.size != 1 || xs.size == 1)
res34: List[List[(Char, Int)]] = List(List((a,1)))

scala> aa.filter(xs => xs.map(ys => ys._1).distinct.size != 1 || xs.size == 1)
res35: List[List[(Char, Int)]] = List()

scala> ab.filter(xs => xs.map(ys => ys._1).distinct.size != 1 || xs.size == 1)
res36: List[List[(Char, Int)]] = List(List((a,1), (b,1)))

scala> aba.filter(xs => xs.map(ys => ys._1).distinct.size != 1 || xs.size == 1)
res37: List[List[(Char, Int)]] = List(List((a,1), (b,1), (a,1)))
于 2012-10-29T18:07:07.127 回答
0

基于@pagoda_5b 解决方案,我认为我们可以找到更好的解决方案。

你有什么想法:

def noDuplicateKeys(l: List[(Char, Int)]): Boolean = l.toMap.size == l.size

list filter noDuplicateKeys

;)

于 2016-06-27T20:08:25.997 回答