ruby uniq在二维数组的前两列上

时间:2017-04-02 17:05:25

标签: ruby-on-rails arrays ruby

我有一个二维数组,第二维有三个字段。

是否可以在第二维的前两个字段上使用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]}

4 个答案:

答案 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)

Array#first接受参数:

array.uniq!{ |c| c.first(2) }

所以你可以使用:

sep = str(‘,’)