【问题标题】:Ruby: Hash - Sorting/Adjusting Duplicate Values and Storing Back with Key?Ruby:哈希 - 排序/调整重复值并用键存储?
【发布时间】:2014-03-02 16:05:40
【问题描述】:

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

目前我有一个收集并存储在哈希中的值的关系。哈希处理方式可以更改为您认为更好的任何其他方式。我现在只是使用哈希来保持关系,因为它很重要。

比如:

key  -> value

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

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

作为旁注,这里总结了一些针对我的情况需要牢记的重要事项:

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

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

【问题讨论】:

  • 更改值以使其唯一的规则是什么?
  • 我想我明白了。以下是否有资格作为解决方案:{ 1456 => 1, 1532 => 50, 1892 => 3, 1092 => 5, 1487 => 10, 5641 => 5, 1234 => 4, 1687 => 2}{ 1456 => 1, 1532 => 7, 1892 => 3, 1092 => 5, 1487 => 6, 5641 => 5, 1234 => 4, 1687 => 2} 呢?请对每个问题给出是/否的答案。顺便说一句,这就是你应该写散列的方式。
  • 基本上确保该值与其他数字保持相对顺序,因此基本上对于值:1 2 2 4,值为 2 的键值对必须始终保持其相对位置值为 1 和 4 的键值对(我希望这是有道理的)...
  • 所以如果你有1,2,2,3,50,这个可以简单地转到1,2,3,4,5,还是需要保留50:1,2, 3、4、50?
  • 这毫无意义。你需要价值观是独一无二的,但它们是什么并不重要?为什么不只使用一个键数组?它具有排序作为数据结构的特征之一。

标签: ruby sorting hash duplicates


【解决方案1】:
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 数组中。

【讨论】:

  • 考虑到值只需要不同并保持顺序,我会建议一些更有趣的东西,比如:{1456 => "I love donuts, hmmm", 1687 => "I love donuts, hmmmm,...}"
  • 甜甜圈总是很有趣 :) 很好,你说对了,干杯!
猜你喜欢
  • 1970-01-01
  • 2018-07-21
  • 2013-04-06
  • 2011-10-25
  • 2016-11-21
  • 2011-05-19
  • 2017-03-24
  • 2021-11-03
  • 2011-12-28
相关资源
最近更新 更多