Вы могли бы хотеть считать , Что Каждый Программист Должен Знать об Арифметике С плавающей точкой .
необходимо будет определить некоторую точность путем умножения большим количеством:
3.141592 * 1000000 = 3141592
тогда можно сделать часть:
3 + (141592 / 1000000)
и уменьшают через GCD...
3 + (17699 / 125000)
, но нет никакого способа добраться , предназначил часть. Вы могли бы хотеть к всегда , части использования всюду по Вашему коду вместо этого - просто не забывают уменьшать части, когда Вы можете для предотвращения переполнения!
Вот стандартный способ хеширования. Обратите внимание на использование оператора || =
, который является более удобным ( a || = b
) способом записать a = b, если не a
.
array.inject({}) do |hash,item|
hash[item.text]||=item
hash
end.values.inspect
Вы также можете сделать это в одной строке.
Скрипту требуется O (n) проверок равенства текстовых
строк. Это то, что покрывается O (n), когда вы видите хэш.
Это все:
Hash[*a.map{|x| [x.text, x]}].values
короче? да.
(звездочка не обязательна; кажется, требуется для 1.8.6).
Например:
a = [Thing.new('a'), Thing.new('b'), Thing.new('c'), Thing.new('c')]
=> [#<Thing a>, #<Thing b>, #<Thing c>, #<Thing c>]
Hash[a.map{|x| [x.text, x]}].values
=> [#<Thing a>, #<Thing b>, #<Thing c>]
Скучная часть: вот небольшой тестовый класс, который я использовал:
class Thing
attr_reader :text
def initialize(text)
@text = text
end
def inspect
"#<Thing #{text}>"
end
end