ruby - 在特定键的哈希数组中查找重复项

标签 ruby arrays csv hash duplicates

我有一个散列数组(实际上是 CSV 行),我需要查找并保留与两个特定键(用户、部分)匹配的所有行。这是数据示例:

[
  { user: 1, role: "staff", section: 123 },
  { user: 2, role: "staff", section: 456 },
  { user: 3, role: "staff", section: 123 },
  { user: 1, role: "exec", section: 123 },
  { user: 2, role: "exec", section: 456 },
  { user: 3, role: "staff", section: 789 }
]

所以我需要返回的是一个数组,该数组仅包含同一用户/部分组合多次出现的行,如下所示:

[
  { user: 1, role: "staff", section: 123 },
  { user: 1, role: "exec", section: 123 },
  { user: 2, role: "staff", section: 456 },
  { user: 2, role: "exec", section: 456 }
]

我正在尝试的双循环解决方案如下所示:

enrollments.each_with_index do |a, ai|
  enrollments.each_with_index do |b, bi|
    next if ai == bi

    duplicates << b if a[2] == b[2] && a[6] == b[6]
  end
end

但由于 CSV 是 145K 行,它需要永远

我怎样才能更有效地获得我需要的输出?

最佳答案

在效率方面你可能想试试这个:

grouped = csv_arr.group_by{|row| [row[:user],row[:section]]}
filtered = grouped.values.select { |a| a.size > 1 }.flatten

第一个语句按:user:section 键对记录进行分组。结果是:

{[1, 123]=>[{:user=>1, :role=>"staff", :section=>123}, {:user=>1, :role=>"exec", :section=>123}],
 [2, 456]=>[{:user=>2, :role=>"staff", :section=>456}, {:user=>2, :role=>"exec", :section=>456}],
 [3, 123]=>[{:user=>3, :role=>"staff", :section=>123}],
 [3, 789]=>[{:user=>3, :role=>"staff", :section=>789}]}

第二个语句仅选择具有多个成员的组的值,然后将结果展平为您:

[{:user=>1, :role=>"staff", :section=>123},
 {:user=>1, :role=>"exec", :section=>123},
 {:user=>2, :role=>"staff", :section=>456},
 {:user=>2, :role=>"exec", :section=>456}]

这可以提高你的操作速度,但内存方面我不能说大输入会有什么影响,因为这取决于你的机器、资源和文件的大小

关于ruby - 在特定键的哈希数组中查找重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26513919/

相关文章:

python - 如何从 python 列表生成 CSV 文件,其中每个列表项位于单独的行中

ruby - 你如何在 Sinatra 中运行测试?

javascript - 是否有类似的方法来创建没有原型(prototype)的数组?

ruby - 使用现有常量命名 Ruby 方法

php - 数组作为字符串存储回数组?

c - 如何使用 C 中使用数组作为参数的函数进行递归?

java - 使用 CSV 文件而不是 SQL 语句创建 Java ResultSet

java - 要从 CSV 文件中检索数据,请将其拆分并将一列数据存储在字符串数组中,且不重复

ruby-on-rails - 如何从 Rails 中的多个表关联中获取数据?

ruby - 如何在 GMT 中创建时间对象