我有一个包含许多数组的数组(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
答案 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
列的索引。这些值是包含所有垂直相邻元素的位置和计数的哈希值,这些元素至少出现两次。索引0
,2
和3
中的列是唯一不包含垂直相邻重复值的列。索引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_index
,map
或chunk
进行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]}