View Problem

Create a histogram map from a list

Given the list [a,b,a,c,b,b], produce a map {a:2, b:3, c:1} which contains the count of each unique item in the list
ExpandDiskEdit
ruby
histogram = {}
list.each { |item| histogram[item] = (histogram[item] || 0) +1 }
DiskEdit
ruby 1.9
list = %w{a b a c b b}

histogram = list.each_with_object(Hash.new(0)) do |item, hash|
hash[item] += 1
end

p histogram # => {"a"=>2, "b"=>3, "c"=>1}
DiskEdit
ruby
list.inject(Hash.new(0)) {|h, item| h[item] += 1; h}
ExpandDiskEdit
cpp C++/CLI .NET 2.0
for each(String^ entry in input) hash[entry] = hash->ContainsKey(entry)
? Convert::ToInt32(hash[entry]->ToString()) + 1 : 1;
ExpandDiskEdit
cpp C++/CLI .NET 2.0
for each(String^ entry in input) dict[entry] = dict->ContainsKey(entry) ? dict[entry] + 1 : 1;
ExpandDiskEdit
cpp C++0x/C++11
map<string,int> hist;
for (auto e: { "a","b","a","c","b","b" })
++hist[e];
for (auto e: hist)
cout << e.first << " : " << e.second << endl;
ExpandDiskEdit
fsharp
let histogram = (List.foldLeft (fun (acc : Map<char, int>) (e : char) -> if (Map.mem e acc) then (Map.add e ((Map.find e acc) + 1) acc) ; else (Map.add e 1 acc)) (Map.empty) list)
ExpandDiskEdit
fsharp
let histogram list =
let rec histogram' list' dict' =
match list' with
| [] -> dict'
| x :: xs ->
match Map.tryFind x dict' with
| Some(Value) -> histogram' xs (Map.add x (Value + 1) dict')
| None -> histogram' xs (Map.add x 1 dict')
histogram' list Map.empty

// ------

let histogram' = histogram list
ExpandDiskEdit
fsharp
let histogram = (List.foldLeft (fun (acc : Generic.Dictionary<char, int>) (e : char) -> (if acc.ContainsKey(e) then acc.[e] <- acc.[e] + 1 ; else acc.Add(e, 1)) ; acc) (new Generic.Dictionary<char, int>()) list)
ExpandDiskEdit
fsharp 2.0
let histogram =
list
|> Seq.groupBy (fun a -> a)
|> Seq.map(fun (key, elements) -> key, Seq.length elements)
|> Map.ofSeq
ExpandDiskEdit
groovy
histogram = [:]
list.each { item ->
if (!histogram.containsKey(item)) histogram[item] = 0
histogram[item]++
}
ExpandDiskEdit
groovy
histogram = [:]
list.each { histogram[it] = (histogram[it] ?: 0) + 1 }

Submit a new solution for ruby, cpp, fsharp, or groovy
There are 27 other solutions in additional languages (clojure, csharp, erlang, fantom ...)