1

如何按它们的 :type 对以下数组的哈希进行排序?我想以周期性的方式对它们进行数字排序。我的意思是让类型变为 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 语句,所以当迭代器 == 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]

4

3 回答 3

4

为了将来的访问者的利益,不要对 SHiNKiROU 使用 '.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

不是为了任何粗鲁的代表这样做,只是想帮助别人

于 2013-10-10T00:43:45.540 回答
3
groups = values.group_by { |v| v[:type] }
puts groups.values.transpose.flatten
于 2013-10-10T00:27:12.880 回答
1

使用邮编:

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}] 
于 2013-10-10T00:21:06.607 回答