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}

要素を にグループ化し、Mapそのキーは でありA、その値はBそのキーと対になった の対応するリストです。

この値から、サイズが 1 以下のもののみを受け入れることができます

于 2012-10-29T14:02:44.207 に答える
1

次のコードはあなたが望むことをすると思います(最初のペアだけを削除しますよね?):

そのためにパターンマッチングを使用しています。すべてをフィルタリングしたい場合は、リストに対して再帰を行うか、カイルが提案したことを行うことができます。これをチェックしてください:

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))

個別は、結果の空のリストをフィルタリングするだけです。

乾杯!

于 2012-10-29T13:45:18.743 に答える
1

List[List[Tuple2[Char, Int]]] これは、リストの要素に同じ要素がある場所からアイテムを除外するものと見なされました 。この場合、リストの要素は、要素が同じ場合にList[Tuple2[Char, Int]]a を返したいものです。BooleanこれList[Tuple2[Char, Int]]は の最初の要素にマップされ、Tupledistinct と size を使用して新しい文字リストにロジックが適用され、要素が同じかどうかがチェックされ、要素が 1 つしかない要素が保持されます。

フィルター

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 に答える