插入到Set中,在Ruby中更改数组中元素的顺序

时间:2009-02-05 16:12:35

标签: ruby arrays set

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

这段代码正在填充数组@search_results中元素的顺序。为什么在集合和数组中插入相同的元素会更改数组的插入顺序?看起来像元素引用的一些问题。有人可以解释一下吗?

编辑1: 我正在使用数组。对不起早期的拼写错误。我通过代码进行了双重检查,它也使用了Array(无论如何都没有Hash的推送方法)

2 个答案:

答案 0 :(得分:2)

无法保证哈希中元素的顺序。如果您想要有保证的订单,则必须对密钥进行排序。

我认为这可以在Ruby 1.9中修复。

编辑:我假设你的结果是一个数组,如果它的哈希然后订单不能保证,你必须对键进行排序,这是我的测试的样子: / p>

#!/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

答案 1 :(得分: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"]