[英]How do I combine two arrays based on the index of their elements?
我正在使用Ruby 2.4。 我想要一个数组,并根据其索引将其元素添加到数组的数组中。 所以如果我从数组开始
[1, 2, 3]
我想将其与数组结合
[4, 5, 6]
我可以得到结果
[[1, 4], [2, 5], [3, 6]]
使用此功能
arr_of_arrays = arr_of_arrays.empty? ? arr : arr_of_arrays.zip(arr).map(&:flatten)
但是,如果我尝试添加的元素比原始元素多的话,这种情况就无法解决。 所以,如果我尝试添加
[4, 5, 6, 7]
到原始阵列,现在我得到
[[1, 4], [2, 5], [3, 6]]
但是我想要的是
[[1, 4], [2, 5], [3, 6], [7]]
如何调整上述功能以实现此目的?
从文档:
如果任何参数的大小小于初始数组的大小,则将提供nil值。
因此,您不必担心第二个数组较短的情况。
如果第一个数组较短,则以nil
填充到第二个数组的长度。
之后,您可以使用compact
删除多余的nil
。
a
更长 a = [1, 2, 3, 4, 5]
b = [6, 7, 8]
a[b.count-1] ||= nil
a.zip(b).map(&:flatten).map(&:compact)
结果:
[[1, 6], [2, 7], [3, 8], [4], [5]]
b
更长 a = [1, 2, 3]
b = [4, 5, 6, 7, 8]
a[b.count-1] ||= nil
a.zip(b).map(&:flatten).map(&:compact)
结果:
[[1, 4], [2, 5], [3, 6], [7], [8]]
nil
变化 a = [1, 2, 3, 4, 5]
b = [6, 7, 8]
a[b.count-1] ||= nil
b[a.count-1] ||= nil
a.zip(b).map(&:flatten) # [[1, 6], [2, 7], [3, 8], [4, nil], [5, nil]]
...和...
a = [1, 2, 3]
b = [4, 5, 6, 7, 8]
a[b.count-1] ||= nil
b[a.count-1] ||= nil
a.zip(b).map(&:flatten) # [[1, 4], [2, 5], [3, 6], [nil, 7], [nil, 8]]
a
或b
,请在某处插入.clone
以便对其进行克隆。 .flatten
摘自OP的示例; 在示例中,它展平了所有充当整数角色的数组。 根据需要保持或离开。 看起来您想要一个“安全”的转置。 之所以称为安全,是因为当子数组的长度不同时,通常的tranpose
会引发错误:
def safe_transpose(*arrays)
l = arrays.map(&:length).max
arrays.map{|e| e.values_at(0...l)}.transpose.map(&:compact)
end
p safe_transpose([1, 2, 3, 4], [5, 6, 7])
#=> [[1, 5], [2, 6], [3, 7], [4]]
p safe_transpose([1, 2, 3], [4, 5, 6], [7, 8, 9])
#=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
如果要保留填充的指甲,可以使用:
def safe_transpose(*arrays)
l = arrays.map(&:length).max
arrays.map{|e| e.values_at(0...l)}.transpose
end
p safe_transpose([1, 2, 3, 4], [5, 6, 7])
#=> [[1, 5], [2, 6], [3, 7], [4, nil]]
p safe_transpose([1, 2, 3], [4, 5, 6], [7, 8, 9])
#=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
原始数组未修改。
我会做...
a << nil while a.length < b.length
a.zip(b).map(&:compact)
但是,这将更改您a
数组,因此您可能需要对a的dup
进行操作。
a = [1,2,3]
b = [4, 5, 6, 7]
arr_of_arrays = []
我想您可以轻松地检查b.size> a.size是否为真,所以
b.each_with_index{|elem, index| a[index].nil? ? arr_of_arrays << [elem] : arr_of_arrays << [a[index],elem]}
返回期望的数组数组:
=> [[1, 4], [2, 5], [3, 6], [7]]
arr1 = [1, 2, 3]
arr2 = [4, 5, 6, 7]
def combine_two_arrays(arr1, arr2)
new_arr = (arr1.size > arr2.size) ? arr1.zip(arr2) : arr2.zip(arr1)
new_arr.map { |arr| arr.compact.sort }
end
combine_two_arrays(arr1, arr2)
a = [1,2,3]
b = [4,5,6,7]
Array.new([a.size, b.size].max) { |i| [a[i],b[i]].compact }
#=> [[1, 4], [2, 5], [3, 6], [7]]
这假定a
或b
的元素都不等于nil
。
如果要包含nil
,只需删除.compact
:
Array.new([a.size, b.size].max) { |i| [a[i],b[i]] }
#=> [[1, 4], [2, 5], [3, 6], [nil, 7]]
在这种情况下,允许a
和b
具有nil
值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.