Ruby在多维数组中搜索相同的值

时间:2017-04-03 17:41:54

标签: arrays ruby find

我有一个包含许多数组的数组(2d)(在这个例子中有四个数组):

[
[13, 15, 18, 23, 23, 11, 14, 19, 19, 5, 10, 10, 8, 8], 
[8, 15, 19, 21, 21, 12, 16, 18, 18, 11, 13, 13, 6, 6], 
[9, 15, 21, 23, 23, 7, 13, 15, 15, 12, 14, 14, 8, 8], 
[2, 8, 14, 16, 16, 7, 13, 15, 15, 12, 14, 14, 8, 8]
]

我需要查找这些数组中的任何元素是否与其他数组中的任何元素相同且索引相同。我需要获取所有这些数字及其索引。

对于前。 First_array [1] = 15 ,以及 second_array [1] = 15 third_array [1] = 15 。所以我需要这些,以及他们的索引。

此外,所有需要的值必须来自阵列左侧或右侧的阵列。对于前者 - array_one [3] = 23 array_two [3] = 21 array_three [3] = 23 。我不需要这些,因为array_two具有不同的值,它将 array_one array_three 分开。

而我能得到的是数组的长度(它们的长度都相同)和数组的数量,作为变量。

我希望你明白我的观点:)

看起来我更接近目标了。这似乎很好地检查了第二个数组(因此只检查了两个第一个数组,但如果这样做,其余的应该更容易)。并且不要评判我,只判断代码:D我知道它的丑陋,它只是一个原型:

array.each do |c|
   c.each do |v|
    c.each_with_index do |k, i|
      next_array = array[i + 1]
          if next_array.include? v 
            its_index = next_array.index(v) 
            if c.index(v) == its_index
            p v
          end
          end
        break
    end
   end 
   return
end

4 个答案:

答案 0 :(得分:3)

arr = [[13, 15, 18, 23, 23, 11, 14, 19, 19,  5, 10, 10, 8, 8], 
       [ 8, 15, 19, 21, 23, 12, 16, 18, 19, 11, 13, 13, 6, 8], 
       [ 9, 15, 21, 23, 16, 12, 13, 15, 15, 12, 14, 14, 8, 8], 
       [ 2, 8,  14, 21, 16,  7, 13, 15, 15, 12, 14, 14, 8, 8]]

我已经在一些地方修改了arr

arr.transpose.each_with_index.with_object({}) do |(col,j),h|
  i = 0
  h[j] = col.chunk(&:itself).each_with_object({}) do |(x,arr),g|
    count = arr.size
    g.update(i=>{ value: x, number: count }) if count > 1
    i += count
  end
end
  #=> {0=>{},
  #    1=>{0=>{:value=>15, :number=>3}},
  #    2=>{},
  #    3=>{},
  #    4=>{0=>{:value=>23, :number=>2}, 2=>{:value=>16, :number=>2}},
  #    5=>{1=>{:value=>12, :number=>2}}
  #    6=>{2=>{:value=>13, :number=>2}},
  #    7=>{2=>{:value=>15, :number=>2}},
  #    8=>{0=>{:value=>19, :number=>2}, 2=>{:value=>15, :number=>2}},
  #    9=>{2=>{:value=>12, :number=>2}},
  #   10=>{2=>{:value=>14, :number=>2}},
  #   11=>{2=>{:value=>14, :number=>2}},
  #   12=>{2=>{:value=> 8, :number=>2}},
  #   13=>{0=>{:value=> 8, :number=>4}}} 

此哈希的键是arr列的索引。这些值是包含所有垂直相邻元素的位置和计数的哈希值,这些元素至少出现两次。索引023中的列是唯一不包含垂直相邻重复值的列。索引1的列包含从行索引3开始的15 0;索引4的列包含2 23,从行索引0开始,2 16' s,从行索引2开始。

答案 1 :(得分:1)

matrix = [
  [13, 15, 18, 23, 23, 11, 14, 19, 19,  5, 10, 10, 8, 8], 
  [ 8, 15, 19, 21, 21, 12, 16, 18, 18, 11, 13, 13, 6, 6], 
  [ 9, 15, 21, 23, 23,  7, 13, 15, 15, 12, 14, 14, 8, 8], 
  [ 2,  8, 14, 16, 16,  7, 13, 15, 15, 12, 14, 14, 8, 8]
]

equal_surround = matrix
  .each_with_index.map do |v,i| 
    v.each_with_index.map do |k,j| 
      if (i-1>=0 && k == matrix[i-1][j])
         k
      elsif (i+1 < matrix.length && k == matrix[i+1][j]) 
         k 
      else
         nil  
      end
    end
  end
=> [
  [nil,  15, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil], 
  [nil,  15, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil], 
  [nil,  15, nil, nil, nil,   7,  13,  15,  15,  12,  14,  14,   8,   8], 
  [nil, nil, nil, nil, nil,   7,  13,  15,  15,  12,  14,  14,   8,   8]
]

答案 2 :(得分:0)

你没有显示任何代码,所以我也不会写任何代码。

我可以告诉你,array#transpose应该使这个问题更容易管理。

您只需要迭代行(以前的列)并查找任何重复的数字。

您可以使用循环或使用Enumerable方法each_with_indexmapchunk进行FORTRAN样式。

答案 3 :(得分:0)

test_array = [
[13, 15, 18, 23, 23, 11, 14, 19, 19, 5, 10, 10, 8, 8], 
[8, 15, 19, 21, 21, 12, 16, 18, 18, 11, 13, 13, 6, 6], 
[9, 15, 21, 23, 23, 7, 13, 15, 15, 12, 14, 14, 8, 8], 
[2, 8, 14, 16, 16, 7, 13, 15, 15, 12, 14, 14, 8, 8]
]
final_res = Hash.new {|h,k| h[k] = Array.new }

test_array.each_cons(2).to_a.each_with_index  do |(a,b),i|

    final_match = Hash.new {|h,k| h[k] = Array.new }

    res = a & b

    res.each do |ele|

        a_index = a.each_index.select{|i| a[i] == ele}
        b_index = b.each_index.select{|i| b[i] == ele}

        (a_index &  b_index).size > 0 ? final_match[ele] << (a_index &  b_index) : ''

    end

    final_match.each_value {|v| v.flatten!}

    final_res[:"Match Values Between Array #{i+1} amd Array #{i+2}"] << final_match

end 

final_res.each do |a|

puts a

end

输出:

匹配数组1和数组2之间的值 {15 =&GT; [1]}

匹配数组2和数组3之间的值 {15 =&GT; [1]}

匹配Array 3 amd Array 4之间的值 {15 =&gt; [7,8],7 =&gt; [5],13 =&gt; [6],12 =&gt; [9],14 =&gt; [10,11],8 =&gt; [ 12,13]}