J'ai un tableau, et je veux faire un hash afin que je puisse rapidement se demander "est de X dans le tableau?".
En perl, il est facile (et rapide) pour ce faire:
my @array = qw( 1 2 3 );
my %hash;
@hash{@array} = undef;
Cela génère un hash qui ressemble à ceci:
{
1 => undef,
2 => undef,
3 => undef,
}
Le meilleur que j'ai trouvé en Ruby, c'est:
array = [1, 2, 3]
hash = Hash[array.map {|x| [x, nil]}]
ce qui donne:
{1=>nil, 2=>nil, 3=>nil}
Est-il un meilleur Ruby façon?
EDIT 1
Non, Tableau.inclure? n'est pas une bonne idée. Sa lenteur. Il fait une requête en O(n) au lieu de O(1). Mon exemple du tableau a trois éléments à des fins de concision; assumer le réel a des millions d'éléments. Faisons une petite analyse comparative:
#!/usr/bin/ruby -w
require 'benchmark'
array = (1..1_000_000).to_a
hash = Hash[array.map {|x| [x, nil]}]
Benchmark.bm(15) do |x|
x.report("Array.include?") { 1000.times { array.include?(500_000) } }
x.report("Hash.include?") { 1000.times { hash.include?(500_000) } }
end
Produit:
user system total real
Array.include? 46.190000 0.160000 46.350000 ( 46.593477)
Hash.include? 0.000000 0.000000 0.000000 ( 0.000523)