Ruby中的对象或散列数组

时间:2014-11-09 23:55:44

标签: ruby arrays class sorting hash

今天在Ruby中处理哈希时,我在排序和访问时遇到了一些复杂问题。在我看来,我只需要一个简单的array.pop方法来完成我需要的工作。因为我刚刚学习了类定义,我有一个想法,想看看是否有理由不这样做。

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

此功能内置于哈希和数组数据结构中。

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

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

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

如果您需要排序的值,请获取值并排序:

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

答案 1 :(得分:0)

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]