2016-02-08 4 views
0

Для задачи я пытаюсь вернуть уникальные значения массива без использования uniq. Это то, что я до сих пор, что не работает:Возвращает уникальные значения массива без использования `uniq`

def unique 
    unique_arr = [] 
    input_arr.each do |word| 
    if word != unique_arr.last 
     unique_arr.push word 
    end 
    end 
    puts unique_arr 
end 
input = gets.chomp 
input_arr = input.split.sort 
input_arr.unique 

Мои рассуждения здесь в том, что если я отсортированный массив первых, прежде чем я итерация через него с each, я мог push его unique_arr без повторения будучи возможность рассмотрения, если это дубликат, последнее значение толкнуло бы его.

Я рассматриваю это неправильно?

+0

Почему вы изобретать колесо? Личные упражнения? –

+0

Да, я всего лишь новичок. Я даже не слышал о «uniq», пока вызов не попросил меня не использовать его. – Kevin

+0

Ваш вопрос был неправильным. Если он предназначен для работы только с отсортированным массивом, тогда вы должны были написать так, а не просто подразумевая, что (тонко) в коде. И вы должны заметить, что это отличается от того, что делает 'uniq'. – sawa

ответ

4

Да, вы делаете по крайней мере, две ошибки.

  1. Если вы хотите назвать это как input_arr.unique с input_arr быть массивом, то вы должны определить метод на Array. У вас есть input_arr в вашем теле метода, который исходит из ниоткуда.
  2. puts в последней строке вашего кода выводится на терминал, но заставляет метод возвращать nil, что заставляет его вести себя иначе, чем uniq.

Это может быть исправлено как:

class Array 
    def unique 
    unique_arr = [] 
    each do |word| 
     unique_arr.push(word) unless unique_arr.last == word 
    end 
    unique_arr 
    end 
end 
-1

Это так просто, если вы видите, это так:

a = [1,1,2,3,4] 
h = Hash.new 
a.each{|q| h[q] = q} 
h.values 

и это вернет:

[1, 2, 3, 4] 
3

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

class Array 
    def unique 
    group_by(&:itself).keys 
    end 
end 
+0

приятное решение :) –

+1

Сегодня я узнал 'Сам объект # –

2

Уникальный массив? Это звучит как Set мне:

require 'set' 

Set.new([1,2,3,2,3,4]).to_a 
#=> [1,2,3,4] 
+0

да, Набор - идеальное решение! –

0

я попробовать это три варианта. Только для вызова

class Array 
    def unique 
    self.each_with_object({}) { |k, h| h[k] = k }.keys 
    end 

    def unique2 
    self.each_with_object([]) { |k, a| a << k unless a.include?(k) } 
    end 

    def unique3 
    arr = [] 
    self.map { |k| arr << k unless arr.include?(k) } 
    arr 
    end 
end 
+0

В 'unique', какой смысл делать хэш-значение (а не ключ)' k'?Не будет ли значение «истина» достаточным и проще? – sawa

+0

В 'unique3', почему вы явно пишете' self'? В чем смысл использования «карты»? – sawa

+0

@sawa В 'unique' Я просто пытаюсь показать больше способов сделать это« вызов », так как вы правы с' true' insted 'k'. В 'unique3' я использую' map' bcs большей скорости и как «новый» способ имеют значения uniq. –

0

Вот еще один способ сделать это:

uniques = a.each.with_object([]) {|el, arr| arr << el if not arr.include?(el)}