2012-11-04 56 views
3

我有一個數組,我想從它構建一個映射記錄數組中元素的頻率。所以對於下面的例子,map = [15:2,16:1]就是它的樣子。我如何在Groovy中做到這一點?建立頻繁計數地圖在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 
    } 
+0

至於你的代碼有什麼問題。首先,如果你想讓地圖成爲地圖,地圖應該用[:]初始化。第二,你不能把v ++放到地圖中,那就是15 ++,16 ++等值。使用map.put k,map.get(k)++ – billjamesdev

回答

13

在Groovy 1.8或更高版本,

assert [15, 16, 15].countBy { it } == [15: 2, 16: 1] 
1

你可以修改你的代碼如下:

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. 地圖需要用大括號之間的冒號來啓動,正如Bill Ja的註釋mes在評論中。
  2. 不能在數組列表上使用each的雙參數版本
  3. 後綴增量不會導致增量值被保存;此外,明確的putAt調用很好,但它在那裏提供更加富有表現力的過載[key] = val語法。

所有這一切,我假設這是一個編碼練習,學習groovy。 doelleri的答案更簡潔,並使用提供的工具,所以在現實世界中,我會採用這種方式。