2009-03-02 1 views
29

Мне нужна коллекция, подобная набору. В основном я сканирую длинную строку и добавляю слова в коллекцию, но я хочу, чтобы можно было обнаружить, когда есть дубликаты.Наборы в Ruby?

Если наборы недоступны, что является самым эффективным способом сделать это в Ruby? Брауни указывает, например, код.

ответ

16

documentation Из:

a = [ "a", "a", "b", "b", "c" ] 
a.uniq #gets you ["a", "b", "c"] 
a.uniq.uniq! #gets you nil (no duplicates :) 
+0

Есть ли что-то подобное, что говорит мне о наличии дубликатов в массиве? Или uniq имеет какое-либо возвращаемое значение? – alamodey

+3

uniq: возвращает новый массив, удаляя повторяющиеся значения в self. uniq !: Удаляет повторяющиеся элементы из себя. Возвращает nil, если никаких изменений не производится (т. Е. Дубликатов не найдено). – dirkgently

5

Заканчивать этот адрес /core/classes/Set.html над на ruby-doc.org

+0

Ссылка не работает больше. Удалено ли из основного API? – Florin

+0

Ссылка обновлена ​​... –

60

Существует множество классов в рубин. Вы можете использовать его так:

require 'set' 

set = Set.new 

string = "a very very long string" 

string.scan(/\w+/).each do |word| 
    unless set.add?(word) 
    # logic here for the duplicates 
    end 
end 

Хотя мне интересно, если вы хотели бы рассчитывать экземпляры в этом случае следующий пример будет лучше:

instances = Hash.new { |h, k| h[k] = 0 } 

string.scan(/\w+/).each do |word| 
    instances[word] += 1 
end 
+1

На Ruby 1.9 и вам больше не нужно «требовать набор», оно уже есть. Кроме того, когда вы делаете 'my_set.concat [1,2,3]' , вещи, которые вы добавляете в набор, будут переданы другому 'Set' – Julik

+1

@Julik, вам все равно придется« требовать «установить». – ndn

 Смежные вопросы

  • Нет связанных вопросов^_^