Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby中数组的多字段排序_Ruby_Algorithm_Sorting_Hash - Fatal编程技术网

ruby中数组的多字段排序

ruby中数组的多字段排序,ruby,algorithm,sorting,hash,Ruby,Algorithm,Sorting,Hash,我有这样一个数组: - {"name"=>“A”, "10"=>30, "2" =>40, "90"=>0} {"name"=>“B”, "10"=>20, "2" =>40, "90"=>0} {"name"=>“C”, "10"=>20, "2" =>40, "90"=>10} --- 我想首先按最高键(90)排序: 然后按下一个较高的键(10,按数字顺序)排序:

我有这样一个数组:

-  
        {"name"=>“A”, "10"=>30, "2" =>40, "90"=>0}
        {"name"=>“B”, "10"=>20, "2" =>40, "90"=>0}
        {"name"=>“C”, "10"=>20, "2" =>40, "90"=>10}

---
我想首先按最高键(90)排序:

然后按下一个较高的键(10,按数字顺序)排序:

然后按下一个更高的键2排序:

我如何在ruby中实现它

--- 更新: 未定义键,例如,它可以是50、10、2。但它会从最高到最低排序

我知道是否定义了键(例如): 结束 我们可以这样做,但不知道如果键未定义,我该怎么做(比如,我可以在排序中进行迭代吗?)

所以,总的来说,我想按从高到低的所有数值进行排序

  • 与示例中一样,
    arr
    的所有元素(散列)具有相同的键
  • A
    B
    C
    都是文字(例如字符串或符号),因此我将它们改为
    “A”
    “B”
    “C”
    ;及
  • 通过“…按最高键…”您的意思是“…按除
    'name'
    以外的键,该键在转换为整数后最大…”。而
    10>2#=>true
    “10”>“2”#=>false

因此,数组如下所示

arr = [{ "name"=>"A", "10"=>30, "2" =>40, "90"=>0 },
       { "name"=>"B", "10"=>20, "2" =>40, "90"=>0 },
       { "name"=>"C", "10"=>20, "2" =>40, "90"=>10 }]
这是执行排序的一种方法

keys = (arr.first.keys - ["name"]).sort_by(&:to_i).reverse
  #=> ["90", "10", "2"]
arr.sort_by { |h| h.values_at(*keys) }
  #=> [{"name"=>"B", "10"=>20, "2"=>40, "90"=>0},
  #    {"name"=>"A", "10"=>30, "2"=>40, "90"=>0},
  #    {"name"=>"C", "10"=>20, "2"=>40, "90"=>10}]
例如,
sort\u By
arr[0]
的块计算是

{ "name"=>"A", "10"=>30, "2" =>40, "90"=>0 }.values_at(*keys)
  #=> { "name"=>"A", "10"=>30, "2" =>40, "90"=>0 }.values_at("90", "10",  "2") 
  #=> [0, 30, 40]
有关如何比较相同大小的数组的说明,请参见(第3段)。另请参见。

我认为

  • 与示例中一样,
    arr
    的所有元素(散列)具有相同的键
  • A
    B
    C
    都是文字(例如字符串或符号),因此我将它们改为
    “A”
    “B”
    “C”
    ;及
  • 通过“…按最高键…”您的意思是“…按除
    'name'
    以外的键,该键在转换为整数后最大…”。而
    10>2#=>true
    “10”>“2”#=>false

因此,数组如下所示

arr = [{ "name"=>"A", "10"=>30, "2" =>40, "90"=>0 },
       { "name"=>"B", "10"=>20, "2" =>40, "90"=>0 },
       { "name"=>"C", "10"=>20, "2" =>40, "90"=>10 }]
这是执行排序的一种方法

keys = (arr.first.keys - ["name"]).sort_by(&:to_i).reverse
  #=> ["90", "10", "2"]
arr.sort_by { |h| h.values_at(*keys) }
  #=> [{"name"=>"B", "10"=>20, "2"=>40, "90"=>0},
  #    {"name"=>"A", "10"=>30, "2"=>40, "90"=>0},
  #    {"name"=>"C", "10"=>20, "2"=>40, "90"=>10}]
例如,
sort\u By
arr[0]
的块计算是

{ "name"=>"A", "10"=>30, "2" =>40, "90"=>0 }.values_at(*keys)
  #=> { "name"=>"A", "10"=>30, "2" =>40, "90"=>0 }.values_at("90", "10",  "2") 
  #=> [0, 30, 40]

有关如何比较相同大小的数组的说明,请参见(第3段)。另请参见。

是,您可以在
排序依据中迭代:

# first sort the arbitrary integer keys in reverse order (assuming those keys will be same across all hashes)
keys = a[0].
         keys. # ["name", "10", "2", "90"]
         select { |k| k.match?(/^\d+$/) }. # this will basically keep only the integer valued strings: ["10", "2", "90"]
         sort_by(&:to_i). # this will sort them by their integer values: ["2", "10", "90"]
         reverse # ["90", "10", "2"]: this is the order by which you want to sort the hashes

# now use this ordered `keys` to sort the hashes by corresponding values
a.sort_by { |p| keys.map { |x| p[x] } }.reverse

是的,您可以在
排序依据中迭代:

# first sort the arbitrary integer keys in reverse order (assuming those keys will be same across all hashes)
keys = a[0].
         keys. # ["name", "10", "2", "90"]
         select { |k| k.match?(/^\d+$/) }. # this will basically keep only the integer valued strings: ["10", "2", "90"]
         sort_by(&:to_i). # this will sort them by their integer values: ["2", "10", "90"]
         reverse # ["90", "10", "2"]: this is the order by which you want to sort the hashes

# now use this ordered `keys` to sort the hashes by corresponding values
a.sort_by { |p| keys.map { |x| p[x] } }.reverse

欢迎来到SO。请花点时间阅读。重要的一点是:您应该演示为解决问题而编写的代码。按键“10”排序的代码没有按预期排序。您想要三个单独的排序,还是按优先级降序对所有三个键进行单个排序?键始终是“90”、“10”和“2”,还是它们是任意的?@moveson按键排序“10”正是预期的辅助排序键。但是,关于键名的问题是有效的。请注意,“name”键的值无效。它们应该是弦吗?您想按数字排序吗?如果是,为什么这些键是字符串?您的问题不清楚:
'10'
为什么是
'90'
之后的下一个最高键<代码>'2'
大于
'10'
!另外,
'name'
是高于还是低于
'2'
?为什么?此外,即使这与问题的答案无关,您也应该定义
A
B
C
,或者(首选)用文字替代它们,这样,想回答您问题的人就可以复制并粘贴您的测试用例,而不是每个试图回答您问题的人都必须反复思考
A
B
C
可能是什么。欢迎光临。请花点时间阅读。重要的一点是:您应该演示为解决问题而编写的代码。按键“10”排序的代码没有按预期排序。您想要三个单独的排序,还是按优先级降序对所有三个键进行单个排序?键始终是“90”、“10”和“2”,还是它们是任意的?@moveson按键排序“10”正是预期的辅助排序键。但是,关于键名的问题是有效的。请注意,“name”键的值无效。它们应该是弦吗?您想按数字排序吗?如果是,为什么这些键是字符串?您的问题不清楚:
'10'
为什么是
'90'
之后的下一个最高键<代码>'2'
大于
'10'
!另外,
'name'
是高于还是低于
'2'
?为什么?此外,即使这与问题的答案无关,您也应该定义
A
B
C
,或者(首选)用文字替代它们,这样想回答你问题的人就可以复制粘贴你的测试用例,而不是每个试图回答你问题的人都必须一遍又一遍地弄清楚
A
B
C
可能是什么。非常感谢你,这正是我想要的!我还想问一下,如果我想按降序排序,我如何像java一样将comparator添加到sort_中?我看到正常的方式是:arr.sort_by{a |-a[:bar]}。但这种伎俩似乎不适用于这种情况?谢谢哦,找到使用反向函数的方法。这会按照转换为整数的键的降序排序。这就是为什么有
.reverse
。如果要按升序排序,只需删除
。反转
。我不懂java,所以我不能帮你回答剩下的问题。也许读者可以。非常感谢,这正是我想要的!我还想问一下,如果我想按降序排序,我如何像java一样将comparator添加到sort_中?我看到正常的方式是:arr.sort_by{a |-a[:bar]}。但这种伎俩似乎不适用于这种情况?谢谢哦,找到我们的路