2016-05-05 60 views
0

我的列表中包含如何摆脱重复,并与大值?

User1, 0

User2, 50

User3, 30

User1, 50

User3, 68

如何摆脱重复的,而是采取最大他们的价值?

一样需要包含此:User1, 50User2, 50User3, 68和摆脱User1, 0User3, 30

+0

是包含在数组中这个列表?哈希? –

+0

该列表包含在一个数组中。 – Charles

+0

而对也是数组?像** [[User1,0],[User2,50] ...] **? –

回答

2

有很多方法可以做到这一点。这里有三个。

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} 

#3 Enumerable#group_by

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] 
+0

耶,谢谢! – Charles

0

有很多方法可以做到这一点,但我可能会通过使用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]]

+0

耶!谢谢! – Charles