锁定老帖子 主题:Hash自然遍历问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-11
h={ 1=>"a", 21=>"b-1", 22=>"b-2", 23=>"b-3", 3=>"c", 4=>"d" } h.each do |k,v| puts k.to_s + "=>" + v end 结果为: 22=>b-2 23=>b-3 1=>a 3=>c 4=>d 21=>b-1 我期望的结果应为: 1=>a 21=>b-1 22=>b-2 23=>b-3 3=>c 4=>d 一般的问题:Hash里每个元素是按照什么顺序建立的,那么就按照什么顺序遍历.ruby如何处理这个问题? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-04-11
hash
这个词本身就包含了“无序”的意思 |
|
返回顶楼 | |
发表时间:2007-04-11
Hash,联想到其他语言的类似Hash之类的数据结构(比如java的HashTable,HashMap),都是无序的,应该是根据哈希码来查找的吧。
|
|
返回顶楼 | |
发表时间:2007-04-11
哈希表应该没有顺序
|
|
返回顶楼 | |
发表时间:2007-04-11
不知道ruby里有没有LinkedHashSet这样的东西、。
|
|
返回顶楼 | |
发表时间:2007-04-12
weiqingfei 写道 不知道ruby里有没有LinkedHashSet这样的东西、。
YAGNI |
|
返回顶楼 | |
发表时间:2007-04-12
gigix 写道 weiqingfei 写道 不知道ruby里有没有LinkedHashSet这样的东西、。
YAGNI ruby用什么来存储有顺序的hash? |
|
返回顶楼 | |
发表时间:2007-04-12
weiqingfei 写道 gigix 写道 weiqingfei 写道 不知道ruby里有没有LinkedHashSet这样的东西、。
YAGNI ruby用什么来存储有顺序的hash? You Aren't Gonna Need It |
|
返回顶楼 | |
发表时间:2007-04-12
dennis_zane 写道 weiqingfei 写道 gigix 写道 weiqingfei 写道 不知道ruby里有没有LinkedHashSet这样的东西、。
YAGNI ruby用什么来存储有顺序的hash? You Aren't Gonna Need It 看楼主的问题是他已经开始需要了。 |
|
返回顶楼 | |
发表时间:2007-04-12
weiqingfei 写道 dennis_zane 写道 weiqingfei 写道 gigix 写道 weiqingfei 写道 不知道ruby里有没有LinkedHashSet这样的东西、。
YAGNI ruby用什么来存储有顺序的hash? You Aren't Gonna Need It 看楼主的问题是他已经开始需要了。 自己实现一个也不是很难的事情吧,更简单地上rubyforge查找下就有了,比如这个项目http://rubyforge.org/frs/?group_id=728&release_id=2305 # A QueueHash is an ordered hash: Keys are ordered according to when they were # inserted. # # The RubyForge project page is at http://rubyforge.org/projects/queuehash . require 'delegate' class QueueHash < DelegateClass( Array ) Version = '0.1.0' # Creates a QueueHash with all the elements in <tt>array</tt> as keys, and # each value initially set to be the same as the corresponding key. def self.new_from_array(array) new( *( ( array.map { |elt| [ elt, elt ] } ).flatten ) ) end # Takes an even number of arguments, and sets each odd-numbered argument to # correspond to the argument immediately afterward. For example: # queueHash = QueueHash.new (1, 2, 3, 4) # queueHash[1] => 2 # queueHash[3] => 4 def initialize(*values) @pairs = [] 0.step(values.size-1, 2) { |i| @pairs << [ values[i], values[i+1] ] } super( @pairs ) end def ==( otherObj ) if otherObj.class == QueueHash && otherObj.size == size ( 0..size ).all? { |i| keys[i] == otherObj.keys[i] && values[i] == otherObj.values[i] } else false end end def [](key) ( pair = @pairs.find { |pair| pair[0] == key } ) ? pair.last : nil end def []=(key, value); @pairs << [key, value]; end def each; @pairs.each { |pair| yield pair[0], pair[1] }; end def keys; @pairs.map { |pair| pair[0] }; end def values; @pairs.map { |pair| pair[1] }; end end |
|
返回顶楼 | |