簡體   English   中英

如何過濾scala中的元組列表?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM