Ruby:针对特定领域采用独特的子数组

标签 ruby

假设有一个字符串数组:

 array = [["John","Apples"],["Tim","Apples"],["Frank","Apples"],
  ["Tom","Pears"],["John","Pears"],["Frank","Oranges"],["Tim","Oranges"]]

现在的游戏是以一种简单的方式选择在数组的第二个值上唯一的任何记录,例如结果可能是:

 array2 = [["Frank","Apples"],["Tom","Pears"],["Tim","Oranges"]]

有谁知道是否有一种单线机可以做到这一点?

最佳答案

Array#uniq可以采用 block 参数:

array.uniq { |e| e[1] }

例如:

>> array = [["John","Apples"], ["Tim","Apples"], ["Frank","Apples"], ["Tom","Pears"], ["John","Pears"], ["Frank","Oranges"], ["Tim","Oranges"]]
>> array.uniq { |e| e[1] }
=> [["John", "Apples"], ["Tom", "Pears"], ["Frank", "Oranges"]]

您可能会得到第一个匹配项(而不是“可能”输出中的最后一个匹配项),但我认为不能保证会选择哪一个匹配项。

请注意,这仅适用于 1.9,1.8 不喜欢它,因此您必须在 1.8 中更加努力地工作,但不会更加努力:

array.inject({ }) { |h,e| h[e[1]] = e[0]; h }.map { |k,v| [ v, k ] }

inject/map 版本在 1.8 和 1.9 中工作相同。此外,这个选择重复值的最后一个

关于Ruby:针对特定领域采用独特的子数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7174127/

相关文章:

ruby-on-rails - ruby GraphQL : How to order arguments in an option?

ruby - 我如何在 Watir 中模拟私密浏览体验? ( Selenium )

ruby-on-rails - 回调是否停止 rails 中的操作

ruby-on-rails - 批量更新属性

ruby-on-rails - Rails 3 缓存转储错误

ruby - 如何在 Ruby 中使用 UTF-16LE 源代码?

ruby - 在 rspec 中匹配参数的属性值

ruby - 从 User 类继承的多个基于角色的类 - Rails 4

Ruby string.match() 函数失败,在要匹配的字符串中出现相同的字符串

ruby - 如何在 Ruby 迭代中访问计数器?