Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Arrays_Ruby - Fatal编程技术网

Ruby on rails 获取二维数组之间的差异

Ruby on rails 获取二维数组之间的差异,ruby-on-rails,arrays,ruby,Ruby On Rails,Arrays,Ruby,我在使用2D数组获取一个数组中存在而另一个数组中不存在的值时遇到问题 我们有两个阵列 [["001", 1, 3333, "maja", "eka", 17, "110B"], ["005", 1, 1434, "buve", "eka", 27, "110A"], ["008", 1, 1111, "maja", "", 31, "110"]] 第二个呢 [["001", 1, 3333, "maja", "eka", 17, "110B"], ["007", 1, 3381, "buve"

我在使用2D数组获取一个数组中存在而另一个数组中不存在的值时遇到问题

我们有两个阵列

[["001", 1, 3333, "maja", "eka", 17, "110B"], ["005", 1, 1434, "buve", "eka", 27, "110A"], ["008", 1, 1111, "maja", "", 31, "110"]]
第二个呢

[["001", 1, 3333, "maja", "eka", 17, "110B"], ["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]
所以输出应该是

[["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]
我是这样做的,但我很挣扎,因为它只返回1条记录

detect = []
records = first_array.collect {|a| a[0]} - second_array.collect {|a| a[0]}
    records.each do |r|
      detect = first_array.detect { |k, v| k == r }
    end
return detect

您可以使用
-
运算符

a = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["005", 1, 1434, "buve", "eka", 27, "110A"], ["008", 1, 1111, "maja", "", 31, "110"]]
b = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]

# You can find the difference between the arrays with - operator
a - b 
#~> [["005", 1, 1434, "buve", "eka", 27, "110A"], ["008", 1, 1111, "maja", "", 31, "110"]]
b - a 
#~> [["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]
获取一个数组中存在而另一个数组中不存在的值

要获得此结果,您不必编写自己的解决方案,只需:

(a1 - a2) + (a2 - a1)
如果使用
a[0]-b[0]
它将给出一个数组,该数组具有a的值,但不具有b的值。 如果使用
b[0]-a[0]
它将给出一个数组,该数组具有b的值,但不具有a的。 要从使用的两个数组中获得唯一值,应该执行
((a[0]-b[0])-(a[0]-b[0])。uniq

a.each_with_index.map{|arr, index| ((arr - b[index]) + (b[index] - arr)).uniq }.reject!(&:empty?)

(假设两个数组大小相同)

最简单的示例

a1 = [[1,2,3],[1,2]] 
a2 = [[1,2,3],[1,3]]
a1-a2
[[1, 2]] 
a2-a1
[[1, 3]] 

要获得子阵列之间的差异,需要迭代。我相信这提供了简洁性和性能的最佳解决方案,因为其他人处理平面阵列、保留不需要的元素或多次迭代

以下是方法:

如果您使用的是Ruby 2.7:

a = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["005", 1, 1434, "buve", "eka", 27, "110A"], ["008", 1, 1111, "maja", "", 31, "110"]]
b = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]

a.map.with_index { |arr, i| b[i].difference(arr) }
# => [[], ["007", 3381, 31, "110"], ["009", 2824, 28, "110C"]]
或在2.7之前:

a.map.with_index { |arr, i| b[i] - arr }
# => [[], ["007", 3381, 31, "110"], ["009", 2824, 28, "110C"]]
如果需要避免在结果相同的地方出现空数组,可以稍微调整一下:

# Ruby 2.7
a.filter_map.with_index do |arr, i|
  diff = b[i].difference(arr)
  diff if diff.any?
end
# => [["007", 3381, 31, "110"], ["009", 2824, 28, "110C"]]

# < Ruby 2.7
a.each_with_object([]).with_index do |(arr, results), i|
  diff = b[i] - arr
  results << diff if diff.any?
end
# => [["007", 3381, 31, "110"], ["009", 2824, 28, "110C"]]
#Ruby 2.7
a、 使用_索引do | arr,i过滤_映射|
差异=b[i]。差异(arr)
是否有差异?
终止
#=>[“007”,3381,31,“110”],[“009”,2824,28,“110C”]]
#

希望对您有所帮助-如果您有任何问题,请告诉我您的进展情况。

理想的解决方案如下:

    irb> a = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["005", 1, 1434, "buve", "eka", 27, "110A"], ["008", 1, 1111, "maja", "", 31, "110"]]
    irb> b = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]
    irb> b-a
         => [["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]] 

你的问题不清楚<代码>['005',11434',buve',eka',27',110A']
是存在于第一个表中但不存在于其他表中的示例值。是否应该在结果表中?可能与@bццццццц不完全相同。我不同意你的看法。我忘了这两个数组中的值不一样(数组中的值的数量和它们的值),除了第一个值(索引)(我已经修正了帖子)。所以现在事情更复杂了。这是一种可怕的做事方式。你发布了一个问题,去了afk,得到了6个答案,然后回来完全改变了问题?你必须珍惜他人帮助你的时间和努力。你能做的最好的事情就是接受一个能回答你原来问题的答案,然后让一个新问题的措辞更清晰。请确保下次包含适当的示例(而不仅仅是一个)。@请不要无缘无故。如果我不能马上回答,那我就离开电脑了。
    irb> a = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["005", 1, 1434, "buve", "eka", 27, "110A"], ["008", 1, 1111, "maja", "", 31, "110"]]
    irb> b = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]
    irb> b-a
         => [["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]