いつもありがとうございます。立て続けに質問すみません。
質問
kotlin(Javaでもいいのですが)で、以下のような処理をスマートにストリームで記述する方法などありますでしょうか。
{8=2.1, 3=0.5, 4=3.0, 11=1.7}
// このMapを...
. ↓
3=0.5, 4=3.0, 8=2.1, 11=1.7
// keyでsortし
. ↓
0=0.5, 1=3.0, 5=2.1, 8=1.7
// keyの最小値でoffsetし(この場合全てのkeyから3を引く)
. ↓
0=0.5, 1=3.5, 5=5.6, 8=7.3
// value を累積値にし、
. ↓
[(0, 0.5), (1, 3.5), (5, 5.6), (8, 7.3)]
// List<Pair<Int, Double>> で返す
ソースコード
以下のようにダサい感じでは記述ならわかるのですが、スマートな方法などありましたら。。。
kotlin
1 var a = mapOf(8 to 2.1, 3 to 0.5, 4 to 3.0, 11 to 1.7) // 元のMap 2 println("元のMap:" + a) 3 var b = mutableListOf<Pair<Int, Double>>() // 最終型のList 4 var c = 0.0 5 a.keys.sorted().forEach({ 6 c += a[it]!! 7 b.add(it - a.keys.min()!! to c) 8 }) 9 println("最終型のList:" + b)
実行結果
元のMap:{8=2.1, 3=0.5, 4=3.0, 11=1.7} 最終型のList:[(0, 0.5), (1, 3.5), (5, 5.6), (8, 7.3)]
累積値?以外なら
まあまあスッキリ書ける
kotlin
1var a = mapOf(8 to 2.1, 3 to 0.5, 4 to 3.0, 11 to 1.7) // 元のMap 2println(a.toList().sortedBy { it.first }.map { Pair(it.first - a.keys.min()!!, it.second) }) 3 4[(0, 0.5), (1, 3.0), (5, 2.1), (8, 1.7)]
回答2件
あなたの回答
tips
プレビュー