如何在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发布的问题,由于您实际修改了问题的规范,因此建议将值转换为实际的集合。