首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们能写一个没有散列类的散列吗?

我们能写一个没有散列类的散列吗?
EN

Stack Overflow用户
提问于 2016-03-29 17:32:16
回答 3查看 145关注 0票数 2

为了解决这个问题,让我们假设我们在Ruby中没有一个hash类。

在Ruby中不使用hash可以创建hash class吗?或者,如果我们没有散列概念,我们可能称之为associative array

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-29 22:23:14

虽然使用Array模拟哈希的行为是可能的,但性能将受到影响:

代码语言:javascript
复制
require 'fruity'

CHARS = ('a' .. 'z').to_a
ARY = CHARS.zip(CHARS)
HASH = ARY.to_h

compare do 
  _assoc_a { ARY.assoc('a') }
  _hash_a  { HASH['a']      }
  _hash_m  { HASH['m']      }
  _assoc_m { ARY.assoc('m') }
  _assoc_z { ARY.assoc('z') }
  _hash_z  { HASH['z']      }
end
# >> Running each test 32768 times. Test will take about 3 seconds.
# >> _hash_m is similar to _hash_z (results differ: m vs z)
# >> _hash_z is similar to _hash_a (results differ: z vs a)
# >> _hash_a is faster than _assoc_a by 2x ± 1.0 (results differ: a vs ["a", "a"])
# >> _assoc_a is faster than _assoc_m by 5x ± 1.0 (results differ: ["a", "a"] vs ["m", "m"])
# >> _assoc_m is faster than _assoc_z by 2x ± 0.1 (results differ: ["m", "m"] vs ["z", "z"])

执行反向查找,从第二个元素到第一个元素,或者从值到键:

代码语言:javascript
复制
compare do
  _rassoc_a      { ARY.rassoc('a')  }
  _hash_rassoc_a { HASH.rassoc('a') }
  _rassoc_m      { ARY.rassoc('m')  }
  _hash_rassoc_m { HASH.rassoc('m') }
  _rassoc_z      { ARY.rassoc('z')  }
  _hash_rassoc_z { HASH.rassoc('z') }
end
# >> Running each test 32768 times. Test will take about 4 seconds.
# >> _rassoc_a is faster than _hash_rassoc_a by 2x ± 1.0
# >> _hash_rassoc_a is faster than _rassoc_m by 3x ± 1.0 (results differ: ["a", "a"] vs ["m", "m"])
# >> _rassoc_m is similar to _hash_rassoc_m
# >> _hash_rassoc_m is similar to _rassoc_z (results differ: ["m", "m"] vs ["z", "z"])
# >> _rassoc_z is similar to _hash_rassoc_z

对我来说,将哈希反向查找键的速度要慢一些,因为哈希不是针对这类事情进行优化的。如果我需要这样做,我尝试创建一个单独的哈希,反转键和值,然后使用它进行反向查找:

代码语言:javascript
复制
hash = {'a' => 1, 'b' => 2}
reversed_hash = hash.invert # => {1=>"a", 2=>"b"}

如果值是数组或值不是唯一的,并且有时结果键不太方便使用,则会中断。

票数 2
EN

Stack Overflow用户

发布于 2016-03-29 23:00:18

在Ruby中不使用hash可以创建hash class吗?或者,如果我们没有散列概念,我们可能称之为associative array

当然了。为什么不是呢?哈希表的概念与任何特定语言无关。

此外,Ruby是一种图灵完整的语言,这意味着您可以用Ruby计算所有东西,这也可以用任何其他语言进行计算。

班级是用纯Ruby编写的,它显然不能使用Hash类,所以很明显,用纯Ruby编写Hash是可能的。为什么不是呢?YARV的Hash类是用C编写的,JRuby的Hash类是用Java编写的,IronRuby的类是用C♯编写的,而Topaz的类是用RPython编写的,如果您想用Ruby编写一个类,您“只需要”编写与所有这些类相同的东西,除了用Ruby代替C、Java、C♯或RPython。

(公平地说,Rubinius的Hash实现使用了Tuple,也就是在C++中部分实现,但同样,您只需要用Rubyà重写代码,就可以在Ruby中使用Hash类。)

票数 2
EN

Stack Overflow用户

发布于 2016-03-29 18:32:15

你当然可以。

如果您不想在重新创建您自己的散列类时遇到麻烦,可以使用数组类的assocrassoc方法。见"Ruby...what中的关联数组?“。

示例:

代码语言:javascript
复制
picks = [
 ["AAPL", "buy"],
 ["GOOG", "sell"],
 ["MSFT", "sell"]
]

print picks.assoc("AAPL")
puts #new line 
print picks.rassoc("sell") #gets the first row that contains

输出:

代码语言:javascript
复制
["AAPL", "buy"]
["GOOG", "sell"]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36291185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档