3

配列があり、配列内の要素の頻度を記録するマップを作成したいと考えています。したがって、以下の例では、マップ = [15:2, 16:1] がどのように見えるかを示しています。Groovy でこれを行うにはどうすればよいですか?

static void doSomething()
    {
        def a = [15,16,15]
        def map = []
        a.each{
            k,v-> 
            if(map.contains(it)) 
            map.putAt k, v++
            else
            map.putAt k, 1;
        }

        println map
    }
4

2 に答える 2

14

Groovy 1.8 以降では、

assert [15, 16, 15].countBy { it } == [15: 2, 16: 1]
于 2012-11-04T01:42:21.430 に答える
3

コードを次のように変更できます。

void doSomething() {
        def a = [15,16,15]
        def map = [:]  //1
        a.each {  //2
            if(map.containsKey(it)) map[it] = map[it] + 1  //3
            else map[it] = 1;
        }

        println map
}

これにより、いくつかの問題が修正されます。

  1. ビル・ジェームズのコメントのメモのように、マップは中括弧の間のコロンで開始する必要があります。
  2. eacharraylistで の 2 パラメータ バージョンを使用することはできません
  3. 接尾辞インクリメントでは、インクリメントされた値が保存されません。また、明示的なputAt呼び出しは問題ありませんが、[key] = valより表現力のあるオーバーロードされた構文を提供するためにあります。

とは言っても、これは groovy を学ぶためのコーディング演習だと思います。doelleri の答えはより簡潔で、提供されているツールを使用しているため、実際の状況ではそれを使用します。

于 2012-11-04T20:32:53.287 に答える