案例陈述与Ruby中的哈希查找的优缺点是什么?

时间:2014-12-16 21:21:43

标签: ruby

以下技术的优点和缺点是什么?

修改:以下技术之间有什么区别?**

我正在寻找与性能,灵活性,可读性等相关的差异。其中一些事情比其他事情更明显。

class Foo
  def my_method(name)
    case name
    when "a"
      "a"
    when "b"
      "12312"
    when "c"
      "blahblah"
    when "d"
      "---------"
    when "e"
      1
    when "f"
      :reference
    end
  end
end

vs

class Foo
  MY_HASH = {
    "a" => "a",
    "b" => "12312",
    "c" => "blahblah",
    "d" => "-------",
    "e" => 1,
    "f" => :reference
  }

  def my_method(name)
    MY_HASH[name]
  end
end

2 个答案:

答案 0 :(得分:5)

我会使用哈希常量。

除非有非常多的密钥,否则两种实现中的性能可能看起来相同

但是,使用哈希常量,您可以随时访问常量,甚至可以在您编写的方法之外。您可以直接查看常量(甚至在类外部,即ClassName :: CONSTANT)以获取所有键和值。使用case语句,访问键和值将是..更棘手。

此外,与case语句相比,哈希可以轻松操作,甚至可以动态操作。如果您希望哈希值不可更改,只需将其冻结即可。

HASH_CONSTANT = {one: 1}.freeze
HASH_CONSTANT[:one] = 1
HASH_CONSTANT[:two] #=> RuntimeError: can't modify frozen Hash

案例情况的一个专家将返回一个新的数组或散列作为默认情况。与

HASH_CONSTANT = Hash.new([]).merge(populated_hash)

将使用散列中不存在的任何键返回相同的数组。

# :a and :b are non-existent keys
value_a = HASH_CONSTANT[:a] #=> []
value_a << 1
value_b = HASH_CONSTANT[:b] #=> [1]

然而,如果您将在案例中返回一个空数组&#34;否则&#34;条件,将返回一个新数组。这可能是有益的,具体取决于您的具体用途。

但话又说回来,你总能做到:

HASH_CONSTANT = populated_hash
HASH_CONSTANT[non_existent_key] || []

答案 1 :(得分:2)

从运行时性能的角度来看,switch语句将花费O(N)时间,而hash语句将花费O(1)时间。这是因为switch语句将强制运行时迭代列表中的每个选项,然后才能找到匹配的条件。除非你进行大量的查找,否则这可能不是一个非常重要的区别。

从安全角度来看,可能会通过覆盖现有条目来破坏哈希表。同样,哈希表允许在运行时映射新项目,从而提供更大的灵活性。

从清洁度的角度来看,如果要处理大量条目,使用哈希表会更清晰。一旦你通过了10,20,30个转换语句,事情就会开始变得非常粗糙。