[英]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.