4

2 つのリストがあるとします。

List(("a",1),("b",4),("d",5),("a",7),("b",6)) 

List("a","b","c","d")

そして、最初のリストに基づいてそれらをグループ化し、次のようにします。

List("a" -> List(("a",1),("a",7)), "b" -> List(("b",4),("b",6)), "d" -> List(("d",5)))

これを達成するための最良の方法は何ですか?事前に決定された値に対して groupBy とパターン マッチを使用できることはわかっていますが、2 番目のリストが事前に決定されていない場合、少し行き詰まります。

編集:

処理済みリストのキーとして、2 番目のリスト内のオブジェクトのコピーが必要です。2 番目のリストの on オブジェクトのパラメーターでグループ化する必要があるかもしれませんが、それでもオブジェクト全体をキーとして維持します...それが理にかなっていれば。

List(("a",1),("b",4),("d",5),("a",7),("b",6)) 
List(("a",1,1),("b",2,3),("c",5,6),("d",6,7))

になります:

 List(("a",1,1) -> List(("a",1),("a",7)), ("b",2,3) -> List(("b",4),("b",6)), ("d",6,7) -> List(("d",5)))

分かりづらくてすみません!

4

4 に答える 4

5

あなたの編集ごとに、for-comprehensionを使用して:

for {
  key <- second
  pair <- first.groupBy(_._1).get(key)
} yield key -> pair

または無糖の同等物:

second.flatMap(key => first.groupBy(_._1).get(key).map(key -> _))

これらは両方とも、groupByすべてのキーに対して操作を実行します。これが問題である場合は、もちろん、もう少し冗長な方法で回避できます。

val mappings = first.groupBy(_._1)
second.flatMap(key => mappings.get(key).map(key -> _))

新しい編集に対処するには: 2 番目のリストの各項目を変換して最初のリストのキーとして使用する必要がある場合は、いくつかの方法があります。たとえば、次のようになります。

val first = List(("a", 1), ("b", 4), ("d", 5), ("a", 7), ("b", 6))
val second = List(("a", 1, 1), ("b", 2, 3), ("c", 5, 6), ("d", 6, 7))

また:

for {
  item @ (key, _, _) <- second
  pair <- first.groupBy(_._1).get(key)
} yield item -> pair

または:

for {
  item <- second
  pair <- first.groupBy(_._1).get(item._1)
} yield item -> pair

希望どおりに動作します。

于 2012-08-02T11:52:20.363 に答える
4

解決策は驚くほど簡単です。

first groupBy(_._1) toList

結果:

List((a,List((a,1), (a,7))), (d,List((d,5))), (b,List((b,4), (b,6))))

最初のリストはどこfirstにありますか(2番目のリストの目的は何ですか)?

于 2012-08-02T11:43:14.047 に答える
1

別の方法。

val first = List(("a",1),("b",4),("d",5),("a",7),("b",6))
val second = List(("a",1,1),("b",2,3),("c",5,6),("d",6,7))
first groupBy {k => second find {_._1 == k._1} get}
于 2012-08-02T12:32:12.917 に答える
-1
val a = List(("a",1),("b",4),("d",5),("a",7),("b",6))
val b = List(("a",1,1),("b",2,3),("c",5,6),("d",6,7))
val a1 = a.groupBy{ _._1 }
b.flatMap{ x => a1.get(x._1).map{x -> _} }

また

val a = List(("a",1),("b",4),("d",5),("a",7),("b",6))
val b = List(("a",1,1),("b",2,3),("c",5,6),("d",6,7))
b.view.map{ x => x -> a.filter{ _._1 == x._1 } }.filter{ _._2.nonEmpty }.toList

2 番目の方法が最も効率的です。

于 2012-08-02T15:05:41.123 に答える