ruby多维数组,移动元素

时间:2018-03-06 13:50:57

标签: arrays ruby

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

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"} }

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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] }

答案 2 :(得分:0)

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

arr.partition { |e| e[2] == '4' }.sum([])