2016-06-20 3 views
4

キー/値のSeqをマップに変換したいと考えています。シーケンスの最初の要素は予約されているので、のペアのリストは1の位置から開始します。マップのリスト表現からScalaの実マップへ

質問:この機能をより機能的な方法で実装することは可能ですか?

def list2Map(plainMap:Seq[String]) = { 
    var map = Map[String, String]() 
    var idx = 1; 
    while(plainMap.size > idx) { 
    val key = plainMap(idx) 
    idx += 1 
    val value = plainMap(idx) 
    idx += 1 

    map = map + (key -> value) 
    } 

    map 
} 

assert(list2Map(Seq("reserved slot","key0","value0","key1","value1","key2","value2")) == Map(("key0"->"value0"),("key1"->"value1"),("key2"->"value2"))) 

私はスカラ座で新しいです、と私はコレクションを反復処理するさまざまな方法がたくさんあることを知っているが、私は要素で始まる、繰り返しごとに2つの要素を読み込むためのforeach方法を見つけていません1.

PS:ありがとうございました。私はみんなの反応でたくさんのことを学んでいます!

+1

あまりにキーを末尾カバー質問? – Dima

+0

@Dimaより機能的な方法でこの関数を実装することが可能な場合は疑問です。私は質問を更新しました。 – angelcervera

+0

サンプル入力と期待される出力を提供できますか?ちょうど簡単な例を与えるだけで、答えを得るのに十分な詳細を提供することができます。 –

答えて

4

list.drop(1).grouped(2).map { x => x.head -> x.last }.toMap

+1

'grouped(2)'の後に '.filter(_。length == 2)'を置く方がいいかもしれないので、値のない末尾のキーがあった場合は無視されます。このコードは、末尾のキーの場合、キーと等しい値を設定します。 –

2

あなたはたぶんあなたには、いくつかの再帰的なものを希望、この?:

val list = List("reserved slot", "key0", "value0", "key1", "value1", "key2", "value2") 
val list4Map = list.tail.grouped(2).map { listBy2 => (listBy2(0), listBy2(1)) }.toList 

val map = Map(list4Map: _*) 
+0

いいです。 .toMapを直接使用しているので@Dimaのバージョンを好む。 .toListを使用して次のステップでマップを作成する理由はありますか?どうも! – angelcervera

+0

'grouped'メソッドはリストの' Iterator'を返します。 'Map'ファクトリメソッドに渡すことはできません。' Seq [Tuple2 [A、B]] 'が必要なので、' toList'を追加しました。確かに、あなたの目標を達成するための多くの方法があります。そういうわけで、Scalaは柔軟性があります。:)そして楽しみです! :D –

+0

Thx!はい、それは信じられないほど柔軟で楽しいです。私は恋に落ち始めている。 :) – angelcervera

0

のようなものを意味する:

def seq2Map[T](seq: Seq[T]) = { 
    def rec(seq: Seq[T], map: Map[T,T] = Map.empty[T,T]): Map[T,T] = seq match { 
    case h :: t :: e => rec(e, map + (h -> t)) 
    case _ => map 
    } 
    rec(seq.tail) 
} 
0
(for { Seq(k, v) <- list.tail.grouped(2) } yield k -> v).toMap 

は何

+0

'val list = Vector(" ignored "、" fish "、" wish "、" dish ")'とは何ですか?私は 'List(k、v)'は 'Seq(k、v)'である必要があると思います。 –

+0

@RexKerr 'Seq'は' Vector'でも動作します –

関連する問題