错综复杂地操纵哈希数组的顺序

时间:2013-10-10 00:00:00

标签: ruby

如何通过以下类型对以下数组的哈希值进行排序?我想以循环的方式对它们进行数字排序。我的意思是类型为0,1,0,1,0,1

当前数组:

values = [{value: "First", type: 0},{value: "Second", type: 0},{value: "1111", type: 1},{value: "2222", type: 1}]

如何看待:

values = [{value: "First", type: 0},{value: "1111", type: 1},{value: "Second", type: 0},{value: "2222", type: 1}]

我可以像这样用数字排序:

values.sort_by! { |x| x[:type] }

我将所有类型等于1的项目带到数组的开头,如下所示:

values.sort_by! { |x| x[:type] == 1 ? 1 : 0}

但是我不能像我需要的那样错综复杂地操纵数组。老实说,谷歌搜索了几个小时。我知道如何以数字和字母顺序排列事物以及阳光下的所有事物,但我无法进入那里并确切地说出我想要发生的事情。

也许如果我可以迭代一个变量来跟踪块的使用次数,我可以使用if语句,所以当iterator == 2(意思是它有序的一组0和1)它可以命令下一个对,但实际上我找不到任何东西。 sort_by方法是否适合这种方法?

我希望它也是动态的。如果数组看起来像这样:

values = [{value: "First", type: 0},{value: "Second", type: 0},{value: "1111", type: 1},{value: "2222", type: 1},{value: "Un", type: 2},{value: "Deux", type: 2}]

它应该是这样的:

values = [{value: "First", type: 0},{value: "1111", type: 1},{value: "Un", type: 2},{value: "Second", type: 0},{value: "2222", type: 1},{value: "Deux", type: 2}]

对于我无法解决这个问题感到失望,但我对使用自定义方法排序数组感到不太了解。仅使用ruby默认的升序和降序。

'类型'的数量始终是一致的。 :types(在订购之前)的顺序总是如下所示:

0,0,0,1,1,1

0,0,0,1,1,1,2,2,2

没有0,1,1,2或其他任何东西。

更简单的例子:

[0,0,1,1,2,2]需要排序为[0,1,2,0,1,2]

排序方法需要是动态的,所以它也可以这样做:

[0,0,1,1,2,2,3,3]需要排序为[0,1,2,3,0,1,2,3]

3 个答案:

答案 0 :(得分:4)

为了未来访客的利益,不要对SHiNKiROU使用'.values'方法感到困惑。它不是以某种方式引用'values'数组。 (这是我的错,我不应该调用数组'值'。

只是说清楚:

foobar = [{value: "First", type: 0},{value: "Second", type: 0},{value: "1111", type: 1},{value: "2222", type: 1},{value: "un", type: 2},{value: "deux", type: 2}]

groups = foobar.group_by { |v| v[:type] }
puts groups.values.transpose.flatten

不要为任何讨厌的代表做这件事,只是试图帮助他人

答案 1 :(得分:3)

groups = values.group_by { |v| v[:type] }
puts groups.values.transpose.flatten

答案 2 :(得分:1)

使用zip:

values1 = values.select {|h| h[:type] == 0 }
values2 = values.select {|h| h[:type] == 1 }
values1.zip(values2).flatten
 => [{:value=>"First", :type=>0}, {:value=>"1111", :type=>1}, {:value=>"Second", :type=>0}, {:value=>"2222", :type=>1}]