[英]How to filter a list of tuples in scala?
我在Scala中有以下列表,希望根据以下条件进行过滤:如果存在任何具有重复的第一个值的元组,就像下面的示例一样,我想排除
List((a,1), (a,2))
因为它具有重复的“ a”。
您想要使用仅过滤那些没有重复“键”的列表的功能来过滤result
result filter noDuplicateKeys
此过滤函数必须获取对List[(A,B)]
对的List[(A,B)]
并且仅在所有元素的其他地方都不存在对第一个元素的情况下,才返回true。
def noDuplicateKeys[A, B](xs: List[(A, B)]) =
(xs groupBy (_._1)).values forall {_.size < 2}
它将元素分组到一个Map
其键为A
,其值为与该键配对的B
的对应列表。
从此值中,您只能接受大小不超过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))
唯一标识符将仅过滤结果空列表。
干杯!
我看到这是从List[List[Tuple2[Char, Int]]]
中过滤掉项目,其中List[List[Tuple2[Char, Int]]]
的元素具有相同的元素。 在这种情况下,列表的元素是List[Tuple2[Char, Int]]
,当元素相同时,我想返回一个Boolean
。 此List[Tuple2[Char, Int]]
映射到Tuple
的第一个元素,然后使用“ distinct”和“ size”将逻辑应用于新的char列表,以检查元素是否相同并保留只有一个元素的元素元件。
过滤器
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)))
基于@ pagoda_5b解决方案,我认为我们可以找到更好的解决方案。
你有什么想法:
def noDuplicateKeys(l: List[(Char, Int)]): Boolean = l.toMap.size == l.size
list filter noDuplicateKeys
;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.