我的列表中包含如何摆脱重复,并与大值?
User1, 0
User2, 50
User3, 30
User1, 50
User3, 68
如何摆脱重复的,而是采取最大他们的价值?
一样需要包含此:User1, 50
,User2, 50
,User3, 68
和摆脱User1, 0
和User3, 30
我的列表中包含如何摆脱重复,并与大值?
User1, 0
User2, 50
User3, 30
User1, 50
User3, 68
如何摆脱重复的,而是采取最大他们的价值?
一样需要包含此:User1, 50
,User2, 50
,User3, 68
和摆脱User1, 0
和User3, 30
有很多方法可以做到这一点。这里有三个。
arr = [[:User1, 0], [:User2, 50], [:User3, 30], [:User1, 50], [:User3, 68]]
**#1使用Hash#update **
arr.each_with_object({}) { |(u,x),h| h.update(u=>x) { |_,o,n| [o,n].max } }.to_a
#=> [[:User1, 50], [:User2, 50], [:User3, 68]]
这使用的Hash#update
(又名Hash#merge!
)的形式使用的嵌段({ |_,o,n| [o,n].max }
,以确定存在于这两个散列密钥的值这些变量中的第一个(公共关键字)没有用在块计算中,所以我用下划线表示它(这实际上是一个局部变量) 。
#2排序(使用Enumerable#sort_by),并转换为哈希
arr.sort_by(&:last).to_h
#=> {:User1=>50, :User3=>68, :User2=>50}
第二值的元素,我们首先计算
a = arr.sort_by(&:last)
#=> [[:User1, 0], [:User3, 30], [:User2, 50], [:User1, 50], [:User3, 68]]
当使用(Array#to_h)到a
转换为散列,步骤如下:
h = {}
h[:User1] = 0
h #=> {:User1=>0}
h[:User3] = 30
h #=> {:User1=>0, :User3=>30}
h[:User2] = 50
h #=> {:User1=>0, :User3=>30, :User2=>50}
h[:User1] = 50
h #=> {:User1=>50, :User3=>30, :User2=>50}
h[:User3] = 68
h #=> {:User1=>50, :User3=>68, :User2=>50}
arr.group_by(&:first).map { |k,v| [k, v.map(&:last).max] }
#=> [[:User1, 50], [:User2, 50], [:User3, 68]]
的步骤如下:
h = arr.group_by(&:first)
#=> {:User1=>[[:User1, 0], [:User1, 50]],
# :User2=>[[:User2, 50]],
# :User3=>[[:User3, 30], [:User3, 68]]}
h.map { |k,v| [k, v.map(&:last).max] }
#=> [[:User1, 50], [:User2, 50], [:User3, 68]]
对于第一键 - 值对h上被传递到块,我们有:
k,v = [:User1, [[:User1, 0], [:User1, 50]]]
#=> [:User1, [[:User1, 0], [:User1, 50]]]
k #=> :User1
v #=> [[:User1, 0], [:User1, 50]]
和块计算是:
b = v.map(&:last)
#=> [0, 50]
[k, v.map(&:last).max]
#=> [:User1, [0, 50].max]
#=> [:User1, 50]
耶,谢谢! – Charles
有很多方法可以做到这一点,但我可能会通过使用group_by方法阵列从可枚举得到,像这样开始:
users = [[user1,0],[user2,50],[user3,30],[user1,50],[user3,68]]
user_hash = users.group_by {|user_array| user_array[0]}
这将集团所有具有项目他们的第一个元素的值相同,所以user_hash将有一个结构,如:
{
user1 => [[user1,0],[user1,50]],
user2 => [[user2,50]],
user3 => [[user3,30],[user3,68]]
}
从那里,你要挑获取每个用户的最高值。问题的措辞的方式我假设你希望你的结果作为输入数组的方式返回,所以,我会使用Enumerable#map来转换每个哈希对,并且Enumerable#max_by选择一个最大的第二元件:
unique_users = user_hash.map do |user,array_of_arrays|
array_of_arrays.max_by {|array| array[1]}
end
最终结果,unique_users是[[user1,50],[user2,50],[user3,68]]
耶!谢谢! – Charles
是包含在数组中这个列表?哈希? –
该列表包含在一个数组中。 – Charles
而对也是数组?像** [[User1,0],[User2,50] ...] **? –