Ruby:根据内容获取许多散列的最大出现次数
Ruby: get the max occurrences of many hashes depending their content
我通常像这样计算项目数组 (int) 的最大出现次数:
specialties_with_frequency = specialties.inject(Hash.new(0)) { |h,v| h[v] += 1; h }
@reference.specialty_id = specialties.max_by { |v| specialties_with_frequency[v] }
今天需要统计hashes内容的最大出现次数
varietal 是一个包含以下字段的数据库对象:
id, grape_id, 百分比
我的重复对象可以有多个变体。
@duplicates.each do |duplicate|
duplicate.varietals.each do |varietal|
end
end
比如浏览重复,我会有:
duplicate 1: varietals => {grape_id => 1}, {grape_id => 2}
duplicate 2: varietals => {grape_id => 3}
duplicate 3: varietals => {grape_id => 1}, {grape_id => 2}
duplicate 4: varietals => {grape_id => 3}, {grape_id => 5}
在这种情况下,接受的数据将是:
{grape_id => 1}, {grape_id => 2}
因为有 2 次浏览所有重复项。
我不知道如何在所有事件中探索相同的值。
谢谢,
亚历山大
您可以使用与以前完全相同的代码,只是将变量数组用作频率哈希中的键。只需确保数组已排序,以便相同内容的键相等。
如果 grape_id
是唯一用于检查出现的字段,您可以通过将变量数组映射到数字数组来简化一点,在这种情况下,您的频率构建器将如下所示:
specialties_with_frequency = @duplicates.inject(Hash.new(0)) do |h, duplicate|
grape_ids = duplicate.varietals.map { |v| v[:grape_id] }.sort
h[grape_ids] += 1; h
end
根据您提供的示例,该值现在应为:
{[1, 2]=>2, [3]=>1, [3, 5]=>1}
对于数组和散列,最好使用 Enumerable#group_by
:
with_freq = whatever.group_by { |v| v } # (&:itself) for ruby2.3
.map { |k, v| [k, v.count] }
.to_h
如果您需要一些复杂的分组算法,请更改 { |v| v }
以使用此算法。
我通常像这样计算项目数组 (int) 的最大出现次数:
specialties_with_frequency = specialties.inject(Hash.new(0)) { |h,v| h[v] += 1; h }
@reference.specialty_id = specialties.max_by { |v| specialties_with_frequency[v] }
今天需要统计hashes内容的最大出现次数
varietal 是一个包含以下字段的数据库对象: id, grape_id, 百分比
我的重复对象可以有多个变体。
@duplicates.each do |duplicate|
duplicate.varietals.each do |varietal|
end
end
比如浏览重复,我会有:
duplicate 1: varietals => {grape_id => 1}, {grape_id => 2}
duplicate 2: varietals => {grape_id => 3}
duplicate 3: varietals => {grape_id => 1}, {grape_id => 2}
duplicate 4: varietals => {grape_id => 3}, {grape_id => 5}
在这种情况下,接受的数据将是:
{grape_id => 1}, {grape_id => 2}
因为有 2 次浏览所有重复项。
我不知道如何在所有事件中探索相同的值。
谢谢, 亚历山大
您可以使用与以前完全相同的代码,只是将变量数组用作频率哈希中的键。只需确保数组已排序,以便相同内容的键相等。
如果 grape_id
是唯一用于检查出现的字段,您可以通过将变量数组映射到数字数组来简化一点,在这种情况下,您的频率构建器将如下所示:
specialties_with_frequency = @duplicates.inject(Hash.new(0)) do |h, duplicate|
grape_ids = duplicate.varietals.map { |v| v[:grape_id] }.sort
h[grape_ids] += 1; h
end
根据您提供的示例,该值现在应为:
{[1, 2]=>2, [3]=>1, [3, 5]=>1}
对于数组和散列,最好使用 Enumerable#group_by
:
with_freq = whatever.group_by { |v| v } # (&:itself) for ruby2.3
.map { |k, v| [k, v.count] }
.to_h
如果您需要一些复杂的分组算法,请更改 { |v| v }
以使用此算法。