2009-02-05 48 views
0
@search_results = Array.new 
duplicates = Set.new 
results.each { |result| @search_results.push(result) unless duplicates.add?(result[:url]) } 

这段代码正在琢磨数组@search_results中元素的顺序。为什么在集合和数组中插入相同的元素会改变Array的插入顺序?看起来像元素引用的一些问题。有人可以解释吗?我正在使用数组。我使用数组。对不起,以前的错字。我再次检查代码,它也使用阵列(无论如何不存在推送方法)插入设置更改红宝石中数组中元素的顺序

+0

变量“结果”来自哪里?它的顺序可能是不确定的(例如,如果它是哈希或集合)。 – Chuck 2009-02-05 23:48:12

+0

请定义'乱码':你期望它们在什么顺序?订单如何变化? – Lolindrath 2009-02-06 12:56:05

+0

@chuck - 结果是一个数组。 @Lolindrath - 我期望的顺序与它插入的顺序相同。相反,它给出了一个随机顺序。 – Sanjay 2009-02-06 13:13:14

回答

2

散列中元素的顺序不能保证。如果您需要保证订单,则必须对密钥进行排序。

我认为这应该在Ruby 1.9中修复。

编辑:我假设数组中的搜索结果,如果一个Hash然后顺序不能保证,你将不得不键排序,这里是我的测试是什么样子:

#!/usr/bin/ruby -W 

require 'pp' 
require 'set' 

results = Array.new 

results << {:url => 'http://lifehacker.com'} 
results << {:url => 'http://stackoverflow.com'} 
results << {:url => 'http://43folders.com'} 
results << {:url => 'http://lolindrath.com'} 
results << {:url => 'http://stackoverflow.com'} 
results << {:url => 'http://lifehacker.com'} 



@search_results = Array.new 
duplicates = Set.new 

results.each { |result| @search_results.push(result) unless duplicates.add?(result[:url])} 

puts "## @search_results" 
pp @search_results 

如果我运行,这里的结果:

## @search_results 
[{:url=>"http://stackoverflow.com"}, {:url=>"http://lifehacker.com"}] 

我发现奇怪的,所以只是可以肯定,我把.nil?.add?结束,这里是我的结果:

## @search_results 
[{:url=>"http://lifehacker.com"}, 
{:url=>"http://stackoverflow.com"}, 
{:url=>"http://43folders.com"}, 
{:url=>"http://lolindrath.com"}] 

现在是我所期待的:这是什么意思是“乱码”?

编辑2:经进一步调查,我想这是因为Ruby的超级严格的规定,将非布尔数据,布尔运算符(见Ruby Gotchas on WikipediaStack Overflow, of course)时,这样基本上什么,只有假的是真的假的,其他一切是真的。所以.nil?显式转换为true/false。

irb(main):007:0> puts "zero is true" if 0 
zero is true 
=> nil 
irb(main):008:0> puts "zero is false" unless 0 
=> nil 
0

乱码怎么样?什么样的对象是results?如果resultsSetHash,那么您无法保证results的任何两次遍历的顺序都是相同的。

另外,你可以做

@search_results = results.uniq 

如果resultsArray让所有的唯一结果。

------------------------------------------------------------- Array#uniq 
    array.uniq -> an_array 
------------------------------------------------------------------------ 
    Returns a new array by removing duplicate values in self. 

     a = [ "a", "a", "b", "b", "c" ] 
     a.uniq #=> ["a", "b", "c"]