Ruby:哈希 - 排序/调整重复值并用密钥存储回来?

时间:2014-02-05 23:07:42

标签: ruby sorting hash duplicates

所以我在这里遇到一些问题,决定用什么工具来解决这个问题。这是一个相当复杂的问题,但我会尽力描述它。

此刻,我收集了值并将其存储在哈希值中。做事的哈希方式可以改为你认为更好的任何其他方式。我现在只是使用哈希来保持关系,因为它很重要。

类似于:

key  -> value

1456 -> 1
1532 -> 50
1892 -> 2
1092 -> 5
1487 -> 10
5641 -> 5
1234 -> 2
1687 -> 1

我的目标是获取值,并调整它们,以便没有重复项,然后将调整后的值放回与键的适当关系中。基本上我不希望删除重复值,我希望它们以某种方式更改,以便不再有重复项。 (以上示例中的重复项为:1和2)

这里的附注是对我的情况要记住的一些重要事项的总结:

  • 键值对之间的关​​系(必须始终知道哪个值是针对哪个键)
  • 没有任何重复值
  • 您无法删除键值对,只能更改值。
  • 从最低到最高的值的顺序很重要

通常我会排序整数数组,但在这种情况下,与其他值的关系给我带来了很多麻烦。

1 个答案:

答案 0 :(得分:0)

input = { 1456 => 1,
  1532 => 50,
  1892 => 2,
  1092 => 5,
  1487 => 10,
  5641 => 5,
  1234 => 2,
  1687 => 1 }

values = input.sort_by { |a,b| b }.map { |a,b| a }
# => [1456, 1687, 1892, 1234, 1092, 5641, 1487, 1532]
Hash[*values.flat_map.with_index(1) { |a,i| [a,i] }]
# => {1456=>1, 1687=>2, 1892=>3, 1234=>4, 1092=>5, 5641=>6, 1487=>7, 1532=>8}

所有必要的信息都包含在values数组中。