2017-02-06 5 views
2

スカラーが新しくなったので、私は多くの事をグーグルで解答し、多くの場合、良い答えを見つけます。しかし、私はこの特定の質問に対する答えを見つけることができませんでした。グーグルでの「ポストデクリメント(scala in post-decrement in scala)」は機能上の言語の答えのために、トップにdontcha-use-post-decrement-in-scalaをもたらします。スカラのポストデクリメントのないシーケンスへの序数の割り当て

だから、私は本当に、次を行うための機能的な方法だかを知りたい:

object A { 
    val list = List("a", "b", "c") 
    val map = { 
    var ord = list.size 
    Map(list map { x => (x, { val res = ord; ord -= 1; res }) } : _*) 
    } 
} 

class Test extends org.scalatest.FunSuite { 
    test("") { 
    println(A.map) // Map(a -> 3, b -> 2, c -> 1) 
    } 
} 

それは基本的に与えられたリストからマップを作成し、リストの各要素に減少序符号を付しています(実際のコードもちろん、この最小限の例より複雑です)。

私は特にvar ord = ...(変更可能)と{ val res = ord; ord -= 1; res }(減少後)の部分に不満です:/これを行う別の方法がありますか?

答えて

2

リストを反転させる必要となり迅速なソリューションは、あなたが使用することができzipWithIndex

val list = List("a","b","c") 
list.map (elem => (elem, list.size - list.indexOf(elem))).toMap 

それはあなたにこのような結果が得られます

scala> :pa 
// Entering paste mode (ctrl-D to finish) 

List("a", "b", "c") 
    .reverse 
    .zipWithIndex 
    .toMap 

// Exiting paste mode, now interpreting. 

res4: scala.collection.immutable.Map[String,Int] = Map(c -> 0, b -> 1, a -> 2) 

余分なコレクションの割り当てを気にかけない場合はあなたはviewを削除できます。 .reverse.zipWithIndexと性能が似て

list.toIterator.zip(Iterator.iterate(list.size){_-1}).toMap 
+1

「toMap」を指定すると、2番目の 'reverse'は不要です。 –

+0

@TheArchetypalPaul私は同意します。 OPがそれを見ていたやり方で印刷してください。おそらく私はそれを削除する必要があります。 –

+0

@YuvalItzchakov私は地図が注文されていないことを知っています;) – Alex

0

あなたは、単にこれを書くことができます。

scala.collection.immutable.Map[String,Int] = Map(a -> 3, b -> 2, c -> 1) 
+1

2つの要素が同じ値を持つと失敗します。また、 'indexOf'はO(N)ですので、これは無理です。 –

+0

2つの要素が同じ値を持つ場合、OPが望んでいることは明らかですが... –

+0

あなたの質問ごとに私は解決策を示しましたが、同じキーを複数回使用してマップを作成したいですか? – Dhirendra

2

zip

list.reverse.zip(1 to list.size + 1).toMap 
+0

' + 1'は必要ありません。 –

0

はこれを試してみてください、この場合に便利ですO(N)

1

そして、さらに別の変形

list.zip(list.size to 1 by -1).toMap 

reversesize両方のために:

関連する問題