我有一个二维数组,第二维有三个字段。
是否可以在第二维的前两个字段上使用uniq?
我见过array.uniq! {| C | c.first}。如果我是正确的,这将在数组的第一个字段上应用uniq。
是否可以使用像array.uniq这样的东西! {| C | c.first c.second}?
@array = Array.new()
@array<< Array.new([journal.from_account_number,journal.from_account, journal.buchungsart]) @array中有几个条目。
问题是如何从数组中获取唯一值而不考虑journal.buchungsart。
答案是:@array = @ array.uniq! {| C | [c.first,c.second]}
答案 0 :(得分:3)
是的,将值放在数组中:
array.uniq! {|c| [c.first, c.second]}
答案 1 :(得分:2)
您还可以利用散列键是唯一的这一事实。
arr = [[1, 2, 3],
[2, 1, 4],
[1, 2, 5]]
a = arr.each_with_object({}) { |row, h| h.update(row.first(2)=>row) }.values
#=> [[1, 2, 5], [2, 1, 4]]
请参阅Hash#update(又名merge!
)。
在使用Hash#value提取哈希值之前,我们计算了以下哈希值。
arr.each_with_object({}) { |row, h| h.update(row.first(2)=>row) }
#=> {[1, 2]=>[1, 2, 5], [2, 1]=>[2, 1, 4]}
请注意,对于行中前两个元素的给定值,它是arr
的最后一行,其中这些值将被“保留”。要保留arr
中的第一行,请使用以下内容。
arr.each_with_object({}) { |row, h| h.update(row.first(2)=>row) { |_,o,_| o } }.values
#=> [[1, 2, 3], [2, 1, 4]]
这不会改变arr
。如果要修改arr
,请写
arr.replace(a)
上面定义了a
。
答案 2 :(得分:1)
只需在块中返回两个元素的数组。
由于标准库中未定义Array#second
,请执行
array.uniq! { |c| [c[0], c[1]] }
相反,可以进一步简化为array.uniq! { |c| c[0..1] }
答案 3 :(得分:1)