`
axgle
  • 浏览: 94273 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Hash自然遍历问题

阅读更多
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如何处理这个问题?
分享到:
评论
11 楼 axgle 2007-04-12  
rails下的view中测试通过:
<%
h=ActiveSupport::OrderedHash.new 
h[1]=3
h[2]=2
h[0]=4
%>    

<% h.each do |k,v|%>
<%=k.to_s + v.to_s%>
<%end%>
10 楼 axgle 2007-04-12  
google了一下,rails里有OrderedHash
require "active_support"
include ActiveSupport

h= OrderedHash.new  
 
h[1]="a"
h[21]="b-1"
h[22]="b-2"
h[23]="b-3"
h[3]="c"
h[4]="d"

h.each do |k,v|
  puts k.to_s + "=>" + v 
end
9 楼 dennis_zane 2007-04-12  
weiqingfei 写道
dennis_zane 写道
weiqingfei 写道
gigix 写道
weiqingfei 写道
不知道ruby里有没有LinkedHashSet这样的东西、。

YAGNI
为什么?
ruby用什么来存储有顺序的hash?


You Aren't Gonna Need It
我问的就是why not,
看楼主的问题是他已经开始需要了。

自己实现一个也不是很难的事情吧,更简单地上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



8 楼 weiqingfei 2007-04-12  
dennis_zane 写道
weiqingfei 写道
gigix 写道
weiqingfei 写道
不知道ruby里有没有LinkedHashSet这样的东西、。

YAGNI
为什么?
ruby用什么来存储有顺序的hash?


You Aren't Gonna Need It
我问的就是why not,
看楼主的问题是他已经开始需要了。
7 楼 dennis_zane 2007-04-12  
weiqingfei 写道
gigix 写道
weiqingfei 写道
不知道ruby里有没有LinkedHashSet这样的东西、。

YAGNI
为什么?
ruby用什么来存储有顺序的hash?


You Aren't Gonna Need It
6 楼 weiqingfei 2007-04-12  
gigix 写道
weiqingfei 写道
不知道ruby里有没有LinkedHashSet这样的东西、。

YAGNI
为什么?
ruby用什么来存储有顺序的hash?
5 楼 gigix 2007-04-12  
weiqingfei 写道
不知道ruby里有没有LinkedHashSet这样的东西、。

YAGNI
4 楼 weiqingfei 2007-04-11  
不知道ruby里有没有LinkedHashSet这样的东西、。
3 楼 天之魔神 2007-04-11  
哈希表应该没有顺序
2 楼 dennis_zane 2007-04-11  
Hash,联想到其他语言的类似Hash之类的数据结构(比如java的HashTable,HashMap),都是无序的,应该是根据哈希码来查找的吧。
1 楼 gigix 2007-04-11  
hash
这个词本身就包含了“无序”的意思

相关推荐

    java Map 遍历方法

    `TreeMap`按照键的自然顺序排序,因此在遍历时会自动按顺序输出。 ```java TreeMap, Object&gt; treeMap = new TreeMap(); treeMap.put(1, 1); treeMap.put(2, 2); treeMap.put(3, 3); treeMap.put(4, 4); ...

    List Hashtable 的相关操作 asp.net 内含详细代码示例

    由于 `Hashtable` 不支持自然排序,你需要先将数据转换为可以排序的数据结构,如 `Dictionary, TValue&gt;`,然后再进行排序。 9. **复制 List**: ```csharp List&lt;Hashtable&gt; copyOfHashList = new List(hashList); ``...

    sesvc.exe 阿萨德

    但是 HashMap 原有的问题也都存在,比如在并发场景下使用时容易出现死循环。 final HashMap, String&gt; map = new HashMap, String&gt;(); for (int i = 0; i ; i++) { new Thread(new Runnable() { @Override public...

    【IT十八掌徐培成】Java基础第11天-02.Map集合-hash原理.zip

    在本课程“【IT十八掌徐培成】Java基础第11天-02.Map集合-hash原理”中,将深入探讨Map集合以及其背后的哈希原理。 Map接口不继承Collection接口,而是独立的一类数据结构,其核心方法包括put()用于添加键值对,get...

    FST算法-关新全1

    FST的搜索过程主要包括以下步骤:首先,计算输入term的hash值,然后根据hash值判断该term是否已经在FST bytes中,如果已经在,则直接返回该term对应的output值,如果不在,则遍历FST图,计算该term对应的output值。...

    机器学习论文

    4. **基于二叉树的反向Hash链遍历**:这是数据结构和算法的应用,可能涉及使用二叉树改进哈希表的查找效率,尤其在大数据环境下,通过反向遍历策略优化数据检索。 5. **100815.pdf**:由于文件名不明确,无法直接...

    中文分词系统数据结构参考1

    中文分词是自然语言处理中的基础任务,它涉及到将连续的汉字序列切分成具有语义意义的单个词汇。在构建中文分词系统时,数据结构的选择和设计至关重要,因为它们直接影响到系统的效率和准确性。这里我们将深入探讨...

    南航计算机考研真题之数据结构

    南京航空航天大学(南航)作为一所知名高校,其计算机科学与技术专业的研究生入学考试自然对数据结构有深入且全面的要求。本篇文章将重点围绕“南航计算机考研真题之数据结构”这一主题,解析相关知识点,并以2000年...

    数据结构第六章作业共4页.pdf.zip

    图遍历算法(如深度优先搜索和广度优先搜索)在路由算法、社交网络分析和许多其他问题中至关重要。 3. **堆(Heaps)**:堆是一种特殊的树形数据结构,满足堆属性(最大堆或最小堆),常用于实现优先队列。堆在内存...

    题目整理(链表).pdf

    7. 链表的算法:链表的算法包括插入、删除、遍历、查找等,例如在链表中插入一个元素、删除一个元素、遍历链表、查找链表中的元素等。 8. 链表的题目:链表的题目包括建立链表、插入元素、删除元素、遍历链表、查找...

    十五个经典算法研究与总结、目录+索引

    A*搜索算法是一种启发式搜索算法,通常用于路径查找和图遍历问题。A*算法结合了最佳优先搜索和Dijkstra算法的优点,通过使用启发函数评估路径的成本,从而更高效地找到目标节点。在实际应用中,A*算法广泛应用于游戏...

    十五个经典算法研究与总结、目录+索引(by_....pdf

    遗传算法是一种模拟自然选择和遗传机制的搜索启发式算法,它通过选择、交叉和变异操作来不断迭代寻找最优解。 SIFT算法(尺度不变特征变换)是一种用于图像处理的算法,它能在图像的尺度空间中检测和描述局部特征,...

    算法与数据结构常见问题

    - 伪代码是一种介于自然语言和编程语言之间的表达方式,用于描述算法的逻辑流程。它不依赖于任何特定的编程语言,而是使用简单的语法来清晰地展示算法步骤。 2. **什么是“程序的鲁棒性”?** - 程序的鲁棒性指...

    程序员编程艺术经典算法研究

    A*搜索算法是一种结合了广度优先搜索(BFS)与最佳优先搜索特点的启发式搜索算法,广泛应用于路径寻找和图遍历问题中。它能有效地找到从起点到终点的最短路径。 - **基本原理**:A*算法利用了一个启发函数`f(n) = g...

    十三个经典算法研究与总结、目录+索引

    7. **遗传算法(GA)**:基于生物进化原理的全局优化方法,通过模拟自然选择过程来求解复杂问题。 8. **启发式搜索算法**:包含A*在内的搜索算法,使用启发式信息来指导搜索方向。 9. **SIFT(尺度不变特征变换)...

Global site tag (gtag.js) - Google Analytics