Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 是否有可能从两个动态数组中获得差异,而不考虑它们的顺序?_Ruby On Rails_Ruby_Arrays - Fatal编程技术网

Ruby on rails 是否有可能从两个动态数组中获得差异,而不考虑它们的顺序?

Ruby on rails 是否有可能从两个动态数组中获得差异,而不考虑它们的顺序?,ruby-on-rails,ruby,arrays,Ruby On Rails,Ruby,Arrays,如果我有两个数组,我试着找出它们的差异 [1, 2, 3, 2, 6, 7] - [2, 1] 我得到: [3, 6, 7] [] 但是如果我把这些数组翻转过来 [2, 1] - [1, 2, 3, 2, 6, 7] 我得到: [3, 6, 7] [] 我的问题是,由于我的两个数组是动态的,所以我需要知道两个数组之间是否存在差异,而不管它们的顺序如何。最简单的表达式是什么?使用: 根据文件: Set#^返回一个新的集合,其中包含集合和 给定的可枚举对象 您可以定义它: class A

如果我有两个数组,我试着找出它们的差异

[1, 2, 3, 2, 6, 7] - [2, 1]
我得到:

[3, 6, 7]
[]
但是如果我把这些数组翻转过来

[2, 1] - [1, 2, 3, 2, 6, 7]
我得到:

[3, 6, 7]
[]
我的问题是,由于我的两个数组是动态的,所以我需要知道两个数组之间是否存在差异,而不管它们的顺序如何。最简单的表达式是什么?

使用:

根据文件:

Set#^
返回一个新的集合,其中包含集合和 给定的可枚举对象

您可以定义它:

class Array
  def diff(o)
    (o - self) + (self - o)    # alternatively: (o + self) - (o & self)
  end
end

[2, 1].diff [1, 2, 3, 2, 6, 7] # [3, 6, 7]
[1, 2, 3, 2, 6, 7].diff [2, 1] # [3, 6, 7]
[2, 3, 3, 1].diff [2, 4, 5]    # [4, 5, 3, 3, 1]
[2, 4, 5].diff [2, 3, 3, 1]    # [3, 3, 1, 4, 5]
正确的答案可能取决于你最终想要什么,正如上面的后两个例子所示

如果您只需要唯一的值,则需要首先将两个输入转换为集合,并将结果作为数组返回:

class Array
  def diff(o)
    (o.to_set ^ to_set).to_a   # or simply (o.to_set ^ self).to_a
  end
end

[2, 4, 5].diff [2, 3, 3, 1]    # [4, 5, 3, 1]

(可能也有一个内置的Rails方法。)

需要
要求“设置”
Rails外部:
set.new([1,2,3,2,6,7])-set.new([2,1])
:-)@Denis,谢谢你的评论。我现在的答案是用三元数来计算较大的数,然后减去较大的数。比较两个数组的长度来确定哪个数组去哪里对我来说似乎很简单。如果数组是
[1,2,3]
&
[3,4,5]
(因为在您的示例中没有说明这种情况),结果应该是什么谢谢,丹尼斯。这是经过深思熟虑的。MxyL的也是。你们两个,谢谢
self.to_set
可以替换为
self
,因为
set^
接受一个可枚举对象。+1,因为这
(o-self)+(self-o)
至少对我来说是非常有表现力的:)