假设有一个字符串数组:
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/