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 } 以使用此算法。