我試圖尋找答案,但我發現沒有任何作業......
我有一個看起來像這樣的陣列......[["10", "20", "1"], ["10", "30", "1"], ["10", "30", "1"]]我想按第一個和第二個元素對它們進行分組。
結果[[["10", "20", "1", 1]], [["10", "30", "1", 2], ["10", "30", "1"]]]
從我發現我已經嘗試過這些......
list.group_by{|w| w[3]}.values do |v1| v1.group_by{|l| l[4]} end
list.group_by{|w| w; [w[3], w[4]]}.map{|k, v| [k.first, k.last, v.length]}
這可行,但在分組時只考慮其中一個元素......
sub_group=list.group_by{|w| [w[3], w[4]]}.values
sub_group.each{|group| group[0] << group.length}
uj5u.com熱心網友回復:
您可以對陣列進行分組以獲取元素的數量,然后通過檢查它們的索引來映射值,當它為 0 時,您添加總元素;
[["10", "20", "1"], ["10", "30", "1"], ["10", "30", "1"]]
.group_by(&:itself)
.values
.map do |values|
values.map.with_index do |value, i|
next value [values.length] if i.zero?
value
end
end
# [[["10", "20", "1", 1]], [["10", "30", "1", 2], ["10", "30", "1"]]]
uj5u.com熱心網友回復:
Enumerable#tally和_Enumerable#each_with_object
[["10", "20", "1"], ["10", "30", "1"], ["10", "30", "1"]]
.tally
.each_with_object([]) do |(item, count), new_ary|
new_item = item.dup
new_item << count
new_ary << [new_item]
(count - 1).times { new_ary.last << item }
end
# => [[["10", "20", "1", 1]], [["10", "30", "1", 2], ["10", "30", "1"]]]
您也可以使用Array#flatten!里面的前兩行each_with_object。在這種情況下,times您需要item[..-2]
[["10", "20", "1"], ["10", "30", "1"], ["10", "30", "1"]]
.tally
.each_with_object([]) do |item, new_ary|
item.flatten!
new_ary << [item]
(item.last - 1).times { new_ary.last << item[..-2] }
end
# => [[["10", "20", "1", 1]], [["10", "30", "1", 2], ["10", "30", "1"]]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/510055.html
標籤:数组红宝石通过...分组
