在Ruby中按降序排序哈希不起作用

时间:2015-07-05 15:11:54

标签: ruby hash

我有一个包含提交ID(密钥)和数字(值)的哈希。在下面我如何将值添加到哈希:

@allCommits[commit] = count

以下是提交ID及其值的示例:

Key: 42ac06787b8db8a6a299aa65482072f238dffc21
Value: 3
Key: a2658427039df49687d5ea590d8a0053631a2571
Value: 1
Key: 4ab0aab2e5fe9d650ce1fb96c48587783c7e296c
Value: 1
Key: 469a15d2ecea8671a3f3c77813011163e2605d9e
Value: 4
Key: 66558be4e7ddd5e9d9db3d512c859410d275c97a
Value: 1
Key: ee9b9bac044c8306c81c7b3a3aa0632a7835e913
Value: 2

然后,在打印之前,我想根据值按降序排序哈希。所以,我做了

@allCommits.sort_by {|k,v| v}.reverse

但它没有用,它给了我订单,因为我插入哈希。

我也试过

Hash[@allCommits.sort_by{|k, v| v}.reverse]

但没有。

我在这里看不到问题,有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

这似乎对我有用:

输入:

@all_commits = {
  '42ac06787b8db8a6a299aa65482072f238dffc21' => 3,
  'a2658427039df49687d5ea590d8a0053631a2571' => 1,
  '4ab0aab2e5fe9d650ce1fb96c48587783c7e296c' => 1,
  '469a15d2ecea8671a3f3c77813011163e2605d9e' => 4,
  '66558be4e7ddd5e9d9db3d512c859410d275c97a' => 1,
  'ee9b9bac044c8306c81c7b3a3aa0632a7835e913' => 2
}

puts "Sorted"
@all_commits.sort_by {|k,v| v}.reverse.each{|x| p x}
puts
puts "Unsorted"
@all_commits.each{|x| p x}

输出:

Sorted
["469a15d2ecea8671a3f3c77813011163e2605d9e", 4]
["42ac06787b8db8a6a299aa65482072f238dffc21", 3]
["ee9b9bac044c8306c81c7b3a3aa0632a7835e913", 2]
["4ab0aab2e5fe9d650ce1fb96c48587783c7e296c", 1]
["a2658427039df49687d5ea590d8a0053631a2571", 1]
["66558be4e7ddd5e9d9db3d512c859410d275c97a", 1]

Unsorted
["42ac06787b8db8a6a299aa65482072f238dffc21", 3]
["a2658427039df49687d5ea590d8a0053631a2571", 1]
["4ab0aab2e5fe9d650ce1fb96c48587783c7e296c", 1]
["469a15d2ecea8671a3f3c77813011163e2605d9e", 4]
["66558be4e7ddd5e9d9db3d512c859410d275c97a", 1]
["ee9b9bac044c8306c81c7b3a3aa0632a7835e913", 2]

我的猜测是你执行sort_by但不捕获结果。在ruby中,许多方法返回 new 对象,并且不更新原始哈希。因此,如果您有哈希值,然后在其上调用sort_by,那么在另一行上尝试再次打印哈希值,您将看到原始哈希值,因为它没有更新。相反,您必须使用sort_by调用的返回值。

答案 1 :(得分:0)

我做了这个测试,似乎你的代码工作了:

setResultConverter(button -> {
    // here you can also check what button was pressed
    // and return things accordingly
    return new Result(offsetXText.getText(), offsetYText.getText());
});

输出:

    ImageEffectInputDialog dialog = new ImageEffectInputDialog("Title");
    dialog.showAndWait().ifPresent(result -> {
        // do something with result object, which is of type Result
    });