簡體   English   中英

如何根據兩個元素的索引合並兩個數組?

[英]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

情況1: 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]]

情況2: 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]]

筆記

  • 如果必須修改ab ,請在某處插入.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]] 

這假定ab的元素都不等於nil

如果要包含nil ,只需刪除.compact

Array.new([a.size, b.size].max) { |i| [a[i],b[i]] }
  #=> [[1, 4], [2, 5], [3, 6], [nil, 7]]

在這種情況下,允許ab具有nil值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM