Fastest/One-liner способ удалить дубликаты (ключом) в Массиве Ruby?

Вы могли бы хотеть считать , Что Каждый Программист Должен Знать об Арифметике С плавающей точкой .

необходимо будет определить некоторую точность путем умножения большим количеством:

3.141592 * 1000000 = 3141592

тогда можно сделать часть:

3 + (141592 / 1000000)

и уменьшают через GCD...

3 + (17699 / 125000)

, но нет никакого способа добраться , предназначил часть. Вы могли бы хотеть к всегда , части использования всюду по Вашему коду вместо этого - просто не забывают уменьшать части, когда Вы можете для предотвращения переполнения!

7
задан Lance Pollard 19 October 2009 в 20:29
поделиться

2 ответа

Вот стандартный способ хеширования. Обратите внимание на использование оператора || = , который является более удобным ( a || = b ) способом записать a = b, если не a .

array.inject({}) do |hash,item|
   hash[item.text]||=item
   hash 
end.values.inspect

Вы также можете сделать это в одной строке.

Скрипту требуется O (n) проверок равенства текстовых строк. Это то, что покрывается O (n), когда вы видите хэш.

14
ответ дан 6 December 2019 в 06:24
поделиться

Это все:

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
10
ответ дан 6 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: