2015-11-19 2 views
0

Скажем, у меня есть такой массив:Возвращайтесь подобные элементы массива в Ruby,

arr = ['footballs_jumba_10', 'footballs_jumba_11', 'footballs_jumba_12', 
     'footballs_jumba_14', 'alpha_romeo_11', 'alpha_romeo_12', 
     'alpha_juliet_10', 'alpha_juliet_11'] 

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

return arr.detect{ |a| arr.count(a) > 1 } 

, но, что, если я хотел бы получить только дубликаты первых 10 символов каждого элемента массива, не зная заранее вариации, как это:

['footballs_', 'alpha_rome', 'alpha_juli'] 
+0

Ваш пример был бы лучше, если бы вы включили строку ш Шланг первых 10 символов был уникальным, так как он не был бы возвращен в желаемый результат. (Слишком поздно, чтобы изменить его.) –

ответ

1

Это довольно просто с помощью метода Arry#difference, что я предложил в моем ответе here:

arr << "Let's add a string that appears just once" 
    #=> ["footballs_jumba_10", "footballs_jumba_11", "footballs_jumba_12", 
    # "footballs_jumba_14", "alpha_romeo_11", "alpha_romeo_12", 
    # "alpha_juliet_10", "alpha_juliet_11", "Let's add a string that appears just once"] 

a = arr.map { |s| s[0,10] } 
    #=> ["footballs_", "footballs_", "footballs_", "footballs_", "alpha_rome", 
    # "alpha_rome", "alpha_juli", "alpha_juli", "Let's add "] 
b = a.difference(a.uniq) 
    #=> ["footballs_", "footballs_", "footballs_", "alpha_rome", "alpha_juli"] 
b.uniq 
    #=> ["footballs_", "alpha_rome", "alpha_juli"] 
+0

Простой, прямолинейный, и работал с кусочком и немного регулярного выражения. Спасибо друг! – oorahduc

+1

Вы также можете рассмотреть ветку петрушки и тире орегано. –

1

Использование Array#uniq:

arr.map {|e| e[0..9]}.uniq 
# => ["footballs_", "alpha_rome", "alpha_juli"] 
+0

С 'arr <<" добавить уникальную строку "', 'arr.map {| e | e [0..9]}. uniq # => ["footballs_", "alpha_rome", "alpha_juli", "add uniq"] ', но нужны только дубликаты. –

0

Вы могли бы сделать что-то вроде этого:

def partial_duplicates(elements) 
    unique = {} 
    duplicates = {} 

    elements.each do |e| 
    partial = e[0..9] 

     # If the element is in the hash, it is a duplicate. 
     if first_element = unique[partial] 
     duplicates[first_element] = true 
     duplicates[e] = true 
     else 
     # include the element as unique 
     unique[partial] = e 
     end 
    end 

    duplicates.keys 
end 

Это вернет уникальные дубликаты. Если вы хотите все дубликаты, вы можете просто использовать Array.

Кроме того, это возвращает все полные представления каждого дублирует, как это кажется более полезным и, вероятно, что вы хотите:

partial_duplicates(arr) 
=> ["footballs_jumba_10", "footballs_jumba_11", "footballs_jumba_12", "footballs_jumba_14", "alpha_romeo_11", "alpha_romeo_12", "alpha_juliet_10", "alpha_juliet_11"] 

Если вы хотите только частичные дубликаты вы можете изменить условие:

if unique[partial] 
    duplicates[partial] = true 
else 
    unique[partial] = true 
end 

затем:

partial_duplicates(arr) 
=> ["footballs_", "alpha_rome", "alpha_juli"] 
+0

Поскольку 'e' - это строка, а' duplicates' - хэш, вы не можете писать 'duplicates << e', но вы на правильном пути. Я предлагаю вам сделать 'unique' и' duplicates' sets ('require 'set'; unique = Set.new'). Вы можете написать 'duplicates.add (e)' (или его псевдоним 'duplicates << e'), чтобы добавить' e' в набор, но [Set # add?] (Http://ruby-doc.org/stdlib- 2.2.0/libdoc/set/rdoc/Set.html # method-i-add-3F) было бы лучше, поскольку оно добавляет элемент, если оно еще не установлено, и сообщает, добавлено ли оно. Ваша последняя строка отличается и дает неправильный ответ, когда 'arr' содержит уникальный элемент. Контрольная работа! –

+0

Спасибо за советы Кэри. 'duplicates << e' была ошибкой. Но так как 'Set' на самом деле использует хеши в своей реализации, я решил сохранить хэш, поэтому вам не нужен дополнительный' require'. Что касается последнего предложения, я полностью его удалил. – mrstif

+0

Я не думаю, что избегать «требовать» - это хорошая причина использовать фантовые хэши вместо наборов. По этому аргументу вы никогда не будете использовать наборы, но мы имеем их только для такого рода ситуаций. Это аналогично замене множеств в математике функциями, имеющими определенные свойства. Это сделало бы математику труднее следовать без каких-либо преимуществ. (Вероятно, это также вызвало бы сыпь самоубийств среди математиков. К счастью, большинство рубистов не так страстно.) Меня интересовали бы взгляды других читателей об этом. –

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