如何通过以下类型对以下数组的哈希值进行排序?我想以循环的方式对它们进行数字排序。我的意思是类型为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]
答案 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}]