Как удалить дублирующиеся значения пар из заданного массива в Ruby? - PullRequest
3 голосов
/ 14 мая 2019

Я хочу удалить пару «дубликатов» из массива строк, где каждый элемент имеет форму R1,R2 с различными номерами.В моем случае дубликат будет R2,R1, потому что он имеет те же элементы R1,R2, но инвертирован.

Дано:

a = ['R1,R2', 'R3,R4', 'R2,R1', 'R5,R6']

Полученный массив должен выглядеть примерно так:

a = ['R1,R2', 'R3,R4', 'R5,R6']

Как я могу удалить дубликаты, чтобы у меня было следующее?

Ответы [ 4 ]

5 голосов
/ 14 мая 2019

Решение с Set

require 'set' 

a.uniq { |item| Set.new(item.split(",")) }  # => ["R1,R2", "R3,R4", "R5,R6"]
4 голосов
/ 14 мая 2019

Вот рабочий пример:

array = ['R1,R2', 'R3,R4', 'R2,R1', 'R5,R6']

array.uniq { |a| a.split(',').sort }
0 голосов
/ 14 мая 2019

Если элементы вашего массива являются «парами», они могут быть фактическими парами, а не строками, например:

pairs = [['R1', 'R2'], ['R3', 'R4'], ['R2', 'R1'], ['R5', 'R6']]

И, фактически, поскольку порядок нене имеет значения, похоже, они действительно должны быть установлены:

require 'set'

sets = [Set['R1', 'R2'], Set['R3', 'R4'], Set['R2', 'R1'], Set['R5', 'R6']]

Если это так, то Array#uniq будет просто работать, как и ожидалось:

sets.uniq
#=> [#<Set: {"R1", "R2"}>, #<Set: {"R3", "R4"}>, #<Set: {"R5", "R6"}>]

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

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

sets = a.map {|el| el.split(',') }.map(&Set.method(:new))
0 голосов
/ 14 мая 2019

попробуйте это,

def unique(array)
    pure = Array.new
    for i in array
        flag = false
        for j in pure
            flag = true if (j.split(",").sort == i.split(",").sort)
        end
        pure << i unless flag
    end
    return pure
end

ссылка: https://www.rosettacode.org/wiki/Remove_duplicate_elements#Ruby

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...