2

给定以下哈希数组:

list=[
  {:cod => "0001", :name => "name1", :val => 10},
  {:cod => "0001", :name => "name1", :val => 12},
  {:cod => "0002", :name => "name2", :val => 13},
  {:cod => "0002", :name => "name2", :val => 14},
  {:cod => "0002", :name => "name2", :val => 14},
  {:cod => "0004", :name => "name4", :val => 16},
  {:cod => "0004", :name => "name4", :val => 16},
  {:cod => "0004", :name => "name4", :val => 17},
  {:cod => "0005", :name => "name5", :val => 17},
  {:cod => "0005", :name => "name5", :val => 17},
  {:cod => "0005", :name => "name5", :val => 17},
  {:cod => "0006", :name => "name6", :val => 110},
  {:cod => "0006", :name => "name6", :val => 10},
]

如何删除重复记录?

另外,我怎样才能找到 key 的值的总和:val

4

5 回答 5

2

您可以将一个块传递给uniqArray 的方法来确定唯一性。

list.uniq { |h| h[:val] }

=> [{:cod=>"0001", :name=>"name1", :val=>10},
 {:cod=>"0001", :name=>"name1", :val=>12},
 {:cod=>"0002", :name=>"name2", :val=>13},
 {:cod=>"0002", :name=>"name2", :val=>14},
 {:cod=>"0004", :name=>"name4", :val=>16},
 {:cod=>"0004", :name=>"name4", :val=>17},
 {:cod=>"0006", :name=>"name6", :val=>110}]
于 2012-08-01T15:27:49.803 回答
1

根据到目前为止的答案,您对“删除重复记录”的实际含义有些困惑。我对您的意思的解释是您希望只删除完全重复的记录。如果是这样,那么它比提出的其他解决方案要简单得多:

list.uniq

这将返回:

[{:cod=>"0001", :name=>"name1", :val=>10},
 {:cod=>"0001", :name=>"name1", :val=>12},
 {:cod=>"0002", :name=>"name2", :val=>13},
 {:cod=>"0002", :name=>"name2", :val=>14},
 {:cod=>"0004", :name=>"name4", :val=>16},
 {:cod=>"0004", :name=>"name4", :val=>17},
 {:cod=>"0005", :name=>"name5", :val=>17},
 {:cod=>"0006", :name=>"name6", :val=>110},
 {:cod=>"0006", :name=>"name6", :val=>10}]

如果你想要:val唯一记录的字段总和,你可以这样做:

list.uniq.map{|h| h[:val]}.reduce(:+)

获取唯一元素(如上),然后:val从每个元素中获取值,最后:+对它们应用(加法)以获得总和。

于 2012-08-02T02:46:57.587 回答
1
list.map do |a|
  list.select { |b| b[:cod] == a[:cod] && b[:name] == a[:name] } \
       .reduce { |res, c| {:cod  => c[:cod], :name => c[:name], :val => ((res[:val] + c[:val]) || c[:val])} }
end.uniq { |h| h[:cod]}.each {|c| puts c.inspect}

输出:

{:name=>"name1", :cod=>"0001", :val=>22}
{:name=>"name2", :cod=>"0002", :val=>41}
{:name=>"name4", :cod=>"0004", :val=>49}
{:name=>"name5", :cod=>"0005", :val=>51}
{:name=>"name6", :cod=>"0006", :val=>120}
于 2012-08-01T15:39:12.217 回答
1
list.uniq.group_by { |e| [e[:cod], e[:name]] }.map do |k, v|
  {k => v.map { |h| h[:val] }.reduce(:+)}
end

=> [{["0001", "name1"]=>22}, {["0002", "name2"]=>27}, {["0004", "name4"]=>33}, {["0005", "name5"]=>17}, {["0006", "name6"]=>120}]
于 2012-08-02T14:14:27.330 回答
1

使用 group_by:

list.group_by{|x| x[:cod]}.map{|k, v| v[0].merge({:val => v.map{|x| x[:val]}.reduce(:+)})}
于 2012-08-02T01:23:13.177 回答