2017-02-16 2 views
-2

Как удалить дублированные объекты в массиве объектов. напр:удалить дубликаты в массиве объектов

[#< @a:1, @b:2>, #< @a:3, @b:3>, #<@a:3, @b:3>] => [ #< @a:1, @b:2>, #< @a:3, @b:3>]. 

Также мое понимание нет двух объектов не может быть same..correct меня, если я ошибаюсь.

+1

Трудно понять, что вы здесь задаете. Попробуйте привести пример, который достаточно мал, и мы можем запустить и понять, что вы пытаетесь сделать. –

+0

Добро пожаловать в переполнение стека. Пожалуйста, прочитайте «[ask]» вместе со связанными страницами и «[mcve]». При запросе нам нужно увидеть не просто синтаксически неправильное определение массива. Нам также нужно посмотреть, что вы попробовали, и объяснить, почему это не сработало. В настоящее время похоже, что вы не пробовали, и вы просите нас написать код для вас, поэтому доказательства усилий важны. См. Http://meta.stackoverflow.com/questions/261592. –

ответ

0

Использование Array#uniq. Пример из документации:

a = [ "a", "a", "b", "b", "c" ] 
a.uniq 
# => ["a", "b", "c"] 

Обратите внимание, что этот метод использует их hash или eql? методов для выявления дубликатов. При этом: Если uniq не работает, как ожидалось, то вы, вероятно, убедитесь, что hash или eql? реализованы соответствующим образом.

3

Вы можете использовать Array#uniq, но вам нужно внести небольшое изменение в свой класс. Per the docs, uniq "сравнивает значения с использованием методов hash и eql? для эффективности", поэтому вам необходимо определить hash и eql?, чтобы они идентифицировали два объекта вашего класса как дубликаты. Например, если два объекта с одинаковыми a и b атрибутов являются дубликатами, вы можете сделать это:

class Foo 
    attr_reader :a, :b 

    def initialize(a, b) 
    @a, @b = a, b 
    end 

    def hash 
    [ a, b ].hash 
    end 

    def eql?(other) 
    hash == other.hash 
    end 
end 

arr = [ Foo.new(1, 2), Foo.new(3, 3), Foo.new(3, 3) ] 
p arr.uniq 
# => [#<Foo:0x007f686ac36700 @a=1, @b=2>, #<Foo:0x007f686ac366b0 @a=3, @b=3>] 

В качестве альтернативы, если вы не хотите или не можете определить hash и eql? методы, которые вы можете использовать блок форма uniq:

class Bar 
    attr_reader :a, :b 

    def initialize(a, b) 
    @a, @b = a, b 
    end 
end 

arr2 = [ Bar.new(1, 2), Bar.new(3, 3), Foo.new(3, 3) ] 

p arr2.uniq {|obj| [ obj.a, obj.b ] } 
# => [#<Bar:0x007fe80f7b6750 @a=1, @b=2>, #<Bar:0x007fe80f7b6700 @a=3, @b=3>] 

Вы можете увидеть both of these на repl.it.

+0

Вы можете упомянуть, что 'arr.uniq # => arr', если' Foo # eql? 'Или' Foo # hash' не определен, в этом случае [Object # eql?] (Http://ruby-doc.org /core-2.3.0/Object.html#method-i-hash) и/или [Object # hash] (http://ruby-doc.org/core-2.3.0/Object.html#method-i- хэш) используются 'uniq'. –

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