1

タイプを持つ次の結果 Map がありますMap[Long,Map[String,String]]。Map を に変換したいと思いList[Seq[Long,String]]ます。

次のコードはこれをうまく行います。

val test = for((time, m) <- ret) yield for((k, v) <- m) yield Seq(time, v)

Seq(time, v)問題は、私が実際に唯一の場所を含めたいということですv。たとえば、現在、次の値を取得しています。

    [[
        1344969305196000,
        "Ry7H5_client"
    ],
    [
        1344969777610000,
        "Ry7H5_client"
    ],
    [
        1344965964890000,
        "SOCKET/f6KGcMSVi7"
    ],
    [
        1344969919131000,
        "Ry7H5_client"
    ]]

結果セットに「Ry7H5_client」を 1 回だけ含めたいと思います。これについて最善の方法は何ですか?

4

4 に答える 4

2

for-comprehension で複数のジェネレーターを使用できます (同様に使用される場合)。

val test = (for {
  (time, m) <- ret
  (k,v) <- m
  if v == "Ry7H5_client"
} yield Seq(time, v)).toList
于 2012-08-14T20:01:17.707 に答える
2

sth like で削除するキーを決定できます

val res = Map(1 -> 2, 3 -> 2, 4 -> 1)

val keysToDelete = res.groupBy(_._2).collect { case (_, m) if m.size > 1 => m.keys }.flatten
// keysToDelete: scala.collection.immutable.Iterable[Int] = List(1, 3)

val resultMap = res -- keysToDelete
// resultMap: scala.collection.immutable.Map[Int,Int] = Map(4 -> 1)

編集:

あなたができるフレーズを含むすべての値のキーを収集するには

Map(1 -> "FOO_SOCKET_BAR", 2 -> "FOO_BAR").collect { case (key,value) if value.contains("SOCKET") => key }

より効率的にするために、ここでコンパイル済みの正規表現を使用することもできます。

val regex = ".*SOCKET.*".r
Map(1 -> "FOO_SOCKET_BAR", 2 -> "FOO_BAR").collect { case (key,regex()) => key }
于 2012-08-14T19:34:09.550 に答える
0

これはどう

object SO extends App {

  val ret = Map(
    1344969305196000L -> Map("a" -> "Ry7H5_client"),
    1344969777610000L -> Map("a" -> "Ry7H5_client"),
    1344965964890000L -> Map("a" -> "SOCKET/f6KGcMSVi7"),
    1344969919131000L -> Map("a" -> "Ry7H5_client"))

  val test2 = for {
    (m, time) <- ret.map(_.swap)
    (k, v) <- m
  } yield Seq(time, v)

  println(test2)
}

Gives List(List(1344969919131000, Ry7H5_client), List(1344965964890000, SOCKET/f6KGcMSVi7)) を与える

ps。マップの「a」は、タイプを元の問題と一致させるためのものであり、重要ではないようです。

于 2012-08-14T20:10:47.413 に答える
0

文字列をグループ化してから、各グループの先頭にマップします。

scala> val list = List((1344969305196000L, "Ry7H5_client"), (1344969777610000L,  
"Ry7H5_client"), (1344965964890000L,"SOCKET/f6KGcMSVi7"), (1344969919131000L, "R 
y7H5_client"))
list: List[(Long, java.lang.String)] = List((1344969305196000,Ry7H5_client), 
(1344969777610000,Ry7H5_client), (1344965964890000,SOCKET/f6KGcMSVi7), 
(1344969919131000,Ry7H5_client))

scala> list.groupBy(x => x._2).map((e) =>  e._2.head).toList
res0: List[(Long, java.lang.String)] = List((1344965964890000,SOCKET/f6KGcMSVi7),
(1344969305196000,Ry7H5_client))
于 2012-08-14T19:58:01.893 に答える