2016-08-10 12 views
0

Во-первых, я начинаю как разработчик с использованием ruby-on-rails. Я использую blahblah.sample (x), чтобы получить (x) образцы от блаббла. Что я хочу сделать, я использую цикл, чтобы поместить несколько разных чисел в массив. Я буду использовать метод sample для получения (x) чисел. Вот точка, в которой я не хочу ставить одно и то же число в массиве. Я знаю, что если я положу случайные числа и использую метод uniq, эта проблема будет решена, но я хочу исключить число, которое у меня есть в массиве, прежде чем я поместил его в массив. Как я могу решить эту проблему? Я хочу признать, что у меня есть число в массиве или нет, прежде чем я поместил число внутри массива.Как исключить образцы, которые уже отбираются до

Что я в конечном итоге пытаюсь сделать, это Когда я получаю 10 образцов пользователей для анализа их данных. Поэтому я не хочу анализировать уже проанализированный пользователь. Я хочу узнать, анализируются они или нет.

ответ

-1

Вы можете перетасовать ваш массив и поп-элементы из него.

arr = [1, 2, 3, 4].shuffle! 
elem = arr.pop # 2 
elem = arr.pop # 1 
elem = arr.pop # 4 
elem = arr.pop # 3 
+0

Как это отвечает на вопрос? – mudasobwa

+0

Это именно то, что задают, каждый раз, когда вы вызываете поп, будет возвращено другое случайное значение массива. Вместо того, чтобы каждый раз проверять, содержит ли массив элемент (O (n)), он перетасовывает массив один раз и всегда получает один элемент (O (1)). Метод Pop можно назвать x раз, чтобы получить ожидаемое поведение. –

+0

Я знаю, как работает 'Array # pop' и какая его сложность, спасибо. Ниже приведена точная цитата из OP: «Я хочу ** исключить ** номер, который у меня есть в массиве **, прежде чем поместить его в массив **. Как я могу решить эту проблему? » – mudasobwa

0

вы можете проверить его, используя include? метод на этом массиве, чтобы проверить номер перед тем, как поместить его в массив. как этот

a = [1,2,3,4,5,6,7] 
a.include?(8) != true 
a << 8 
p a 
=> [1, 2, 3, 4, 5, 6, 7, 8] 
+0

вы можете добавить к нему еще одно условие для номера исключения, если оно присутствует в этом массиве. – Navin

+1

'! = True' является избыточным и не рубино-идиоматическим. – mudasobwa

2

Я думаю, что его работу для Set и Set#add? метод:

Set

Комплект реализует набор неупорядоченных значений, не имеющих дубликатов. Это гибрид интуитивных средств взаимодействия Array и Быстрый поиск Хэша.

Set # add?

Добавляет данный объект к набору и возвращает self. Если объект уже в наборе, то возвращается nil.

> set = Set.new([1,2,3,4,5,6,6,7]) 
=> #<Set: {1, 2, 3, 4, 5, 6, 7}> 
> set.add? 7 
=> nil 
> set.add? 8 
=> #<Set: {1, 2, 3, 4, 5, 6, 7, 8}> 
+0

После того как вы построили набор, вам нужно будет извлечь его элементы для обработки. Вы можете сделать это с помощью 'arr = set.to_a', но поскольку наборы не упорядочены,' arr [i] 'не гарантируется равным i-му элементу, добавленному к набору. Потому что (предположительно случайная) выборка участвует, порядок может быть неважным, но я думал, что стоит упомянуть. –

1

Другим вариантом было бы использовать Array#|:

[1,2,3] | [4] 
#⇒ [1,2,3,4] 
[1,2,3] | [1] 
#⇒ [1,2,3] 

Обратите внимание, что он ожидает массив в ГУР:

10.times.inject([]) { |memo, i| memo | [i % 3] } 
#⇒ [0, 1, 2] 
+0

Я сначала думаю о 'union', это очень удобная функция. –

0

Вариант @ метода ЗЕЛЕНЫЙ является использовать хэш, который сохранит порядок, по которому элементы будут добавлены к образцу, а также предоставит некоторую дополнительную информацию, которая может представлять интерес.

Предположим, что значения, полученные даются массива

arr = [1,2,3,4,5,3,6,3,6,7] 

Это может быть подан в хэш подсчета:

h = arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 } 
    #=> {1=>1, 2=>1, 3=>3, 4=>1, 5=>1, 6=>2, 7=>1} 

рубина v1.9+ хеш-ключи будут упорядочены по мере их появления в arr.uniq (который сам поддерживает порядок arr).

Не-повторяющийся образец даются

h.keys 
    #=> [1, 2, 3, 4, 5, 6, 7] 

и h говорит вам, сколько раз каждый из этих значений были сгенерированы счетчику.