我在Scala中有以下列表,我希望根据一个条件进行过滤,如果有任何元组具有重复的第一个值, 如下例所示,我想排除
List((a,1), (a,2))
因为它有“a”作为副本。
答案 0 :(得分:5)
您希望使用仅保留未触及那些没有重复“键”的列表的函数来过滤result
result filter noDuplicateKeys
此过滤函数必须采用对List[(A,B)]
的列表,并且仅当第一个元素对不存在于所有元素的其他位置时才返回true,并且可以实现为
def noDuplicateKeys[A, B](xs: List[(A, B)]) =
(xs groupBy (_._1)).values forall {_.size < 2}
它将元素分组为Map
,其密钥为A
,其值为与该密钥配对的B
s的对应列表。
根据此值,您只能接受大小不超过1的那些
答案 1 :(得分: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将只过滤生成的空列表。
干杯!
答案 2 :(得分:1)
我看到这是从List[List[Tuple2[Char, Int]]]
过滤掉项目,其中列表的元素具有相同的元素。在这种情况下,列表的元素是List[Tuple2[Char, Int]]
,当元素相同时,我想返回Boolean
。这个List[Tuple2[Char, Int]]
被映射到Tuple
的第一个元素,然后使用distinct和size将逻辑应用于新的chars列表,以检查元素是否相同并保留那些只有一个元件。
过滤器
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)))
答案 3 :(得分:0)
基于@ pagoda_5b解决方案,我认为我们可以找到更好的解决方案。
您如何看待:
def noDuplicateKeys(l: List[(Char, Int)]): Boolean = l.toMap.size == l.size
list filter noDuplicateKeys
)