如何在Ruby中从给定数组中删除重复的对值?

如何在Ruby中从给定数组中删除重复的对值?,ruby,Ruby,我想从字符串数组中删除一对“重复项”,其中每个元素的形式为R1,R2,数字各不相同。在我的例子中,一个副本应该是R2,R1,因为它具有与R1,R2相同的元素,但却是反向的 鉴于: a=['R1,R2','R3,R4','R2,R1','R5,R6'] 生成的数组应如下所示: a=['R1,R2','R3,R4','R5,R6'] 我如何才能删除重复项,以便获得以下内容?以下是一个工作示例: array = ['R1,R2', 'R3,R4', 'R2,R1', 'R5,R6'] array

我想从字符串数组中删除一对“重复项”,其中每个元素的形式为
R1,R2
,数字各不相同。在我的例子中,一个副本应该是
R2,R1
,因为它具有与
R1,R2
相同的元素,但却是反向的

鉴于:

a=['R1,R2','R3,R4','R2,R1','R5,R6']
生成的数组应如下所示:

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

我如何才能删除重复项,以便获得以下内容?

以下是一个工作示例:

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

array.uniq { |a| a.split(',').sort }
试试这个

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
def唯一(数组)
pure=Array.new
对于数组中的i
flag=false
对于纯j
如果(j.split(“,”).sort==i.split(“,”).sort),则flag=true
结束

纯带有
集合的解决方案

require'set'
a、 uniq{| item | Set.new(item.split(“,”)}#=>[“R1,R2”,“R3,R4”,“R5,R6”]

如果数组中的元素是“对”,那么它们可能是实际的对,而不是字符串,如下所示:

pairs = [['R1', 'R2'], ['R3', 'R4'], ['R2', 'R1'], ['R5', 'R6']]
sets = a.map {|el| el.split(',') }.map(&Set.method(:new))
而且,事实上,由于顺序似乎并不重要,看起来它们真的应该被设置:

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"}>]

您可以将其缩短为
array.uniq{a | a.split(',').sort.join(',')}
。为什么需要
join
?即使没有:)你是对的:)这是初始答案的剩余。@Ursus问题中所需的输出是字符串数组,而不是数组数组。我不是说这是侮辱,但你提供的解决方案非常不地道。这并不能真正解决OP发布的问题,由于您实际修改了问题的规范,因此建议将值转换为实际的集合。