【问题标题】:Array of objects or hash in Ruby [closed]Ruby中的对象数组或哈希[关闭]
【发布时间】:2015-01-06 05:22:00
【问题描述】:

今天在 Ruby 中使用哈希时,我在排序和访问它时不断遇到一些复杂问题。在我看来,我只需要一个简单的 array.pop 方法来做我需要的事情。由于我刚刚了解了类定义,所以我有了一个想法,想看看是否有理由不这样做。

hash = {"a" => 1, "b" => 2, "c" => 3}

如果我创建一个包含数据值的对象数组,我是否可以不做同样的事情,但让它对更多排序方法和可扩展数据开放? 像这样的

class Key
    attr_accessor :value
    def initialize (value)
        @value = value
    end
end

然后我会创建一个 Key 对象数组。然后我可以比散列更容易地对数组进行排序,并且仍然从键内部获取数据。如果我发现需要将几位数据保存在一起并进行排序,我认为这可以为更多可扩展的代码保持开放。

这是不好的做法吗?你能看到会咬我的情况吗?我用锤子解决问题是因为我刚得到一个锤子吗?

【问题讨论】:

  • 你能再解释一下..你想用你的哈希做什么?
  • 我看到一个似乎需要更多信息的问题已经发布了三个答案。套用@RahulSambari,你想用你的哈希做什么?
  • 在本练习中,我尝试按值排序,然后从哈希中删除最高值,破坏性地将该键值对返回到变量中。在数组中,就像 .pop 方法一样简单。有没有类似调用哈希的东西?
  • 我也在做一个思想实验。我正在考虑一种数据结构,我可以在其中调用一个对象并返回与该键关联的几条数据之一。我知道我可以在值位置使用键值对的散列构建嵌入式散列,但我正在考虑将所有这些值存储在一个对象中,这样可以提供更具可读性的代码,并且我认为构建逻辑的一些有趣选项成数据结构。也就是说,我还是个新手,所以让我知道我是否有可能破坏一切。

标签: ruby arrays class sorting hash


【解决方案1】:

此功能内置于 Hash 和 Array 数据结构中。

如果您使用基于密钥的访问,请获取密钥并对其进行排序:

hsh = {'a' => 1, 'c' => 3, 'b' => 2}

keys = hsh.keys.sort # keys: ['a', 'b', 'c']

如果您需要对值进行排序,请获取值并进行排序:

values = hsh.values.sort  # values: [1, 2, 3]

【讨论】:

    【解决方案2】:

    Hash 包含Enumerable 模块,它为您提供enumerating and sorting 哈希的各种巧妙方式。

    irb(main):006:0> h = {'a' => 1, 'c' => 3, 'b' => 2}
    => {"a"=>1, "c"=>3, "b"=>2}
    
    irb(main):007:0> h.sort { |a,b| b<=> a }
    => [["c", 3], ["b", 2], ["a", 1]]
    
    irb(main):010:0> h = { 'three' => 3, 'one' => 1, 'two' => 2 }
    => {"three"=>3, "one"=>1, "two"=>2}
    
    irb(main):011:0> h.sort { |a,b| a[0] <=> b[0] }
    => [["one", 1], ["three", 3], ["two", 2]]
    
    irb(main):012:0> h.sort { |a,b| a[1] <=> b[1] }
    => [["one", 1], ["two", 2], ["three", 3]]
    

    如果您正在寻找基于某些键排序的哈希值数组:

    irb(main):016:0> h.keys.sort.map { |key| h[key] }
    => [1, 3, 2]
    

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2014-05-30
      • 2017-06-09
      • 2019-04-08
      • 1970-01-01
      相关资源
      最近更新 更多