ruby多维数组,移动元素

问题描述 投票:1回答:3

假设我有一个数组或数组:

arr = [["Foo1", "Bar1", "1", "W"],
       ["Foo2", "Bar2", "2", "X"],
       ["Foo3", "Bar3", "3", "Y"],
       ["Foo4", "Bar4", "4", "Z"],
       ["Foo5", "Bar5", "5", "A"]]

有没有办法可以根据某些标准在二维数组中移动单个数组?

例如,如果内部数组的元素3是“4”,那么将它移到顶部?

所以上面的arr看起来像:

  [["Foo4", "Bar4", "4", "Z"],
   ["Foo1", "Bar1", "1", "W"],
   ["Foo2", "Bar2", "2", "X"],
   ["Foo3", "Bar3", "3", "Y"],
   ["Foo5", "Bar5", "5", "A"]]

我尝试过尝试选择内部数组的方法:

arr.map {|row| row.select {|i| i[3] == "4"} }
arrays ruby
3个回答
2
投票

你当然可以。最简单的方法是首先找到匹配,如果存在,则将其移动到所需位置。

index = arr.index{|i| i[2] == '4' }
arr.insert(0, arr.delete_at(index)) if index

请记住,数组中的索引是基于0的,所以如果要检查数组中的第三个元素,则要查看索引2。


0
投票

最通用的方式可能是使用Array#sort

▶ criteria = ->(arr) { arr[2] == "4" }
#⇒ #<Proc:0x005570424c2568@(pry):8 (lambda)>
▶ arr.sort do |e1, e2|
▷   criteria.(e1) ? -1 : criteria.(e2) ? 1 : e1 <=> e2
▷ end
#⇒ [["Foo4", "Bar4", "4", "Z"],
#   ["Foo1", "Bar1", "1", "W"],
#   ["Foo2", "Bar2", "2", "X"],
#   ["Foo3", "Bar3", "3", "Y"],
#   ["Foo5", "Bar5", "5", "A"]]

这样你可以根据需要更新criteria,一切都会工作。


或者,更明确地保留原始订单(@StefanPochmann的信用额度):

arr.sort_by.with_index { |e, i| [criteria[e] ? 0 : 1, i] }

0
投票

换句话说,如果要移动多个内部数组,也可以使用:

arr.partition { |e| e[2] == '4' }.sum([])
© www.soinside.com 2019 - 2024. All rights reserved.