簡體   English   中英

按數組值將數組數組排序為ruby中的哈希

[英]Sort array of arrays by array value into hash in ruby

我有一個數組數組

[ [1,23,true], [2,33,false],[3,44,true] ]

我正在嘗試根據每個內部數組的[2]值對數組進行排序,因此結果將是

true_values: [ [1,23,true],[3,44,true] ]
false_values: [ [2,33,false] ]

我可以選擇數組對象,但是正在尋找一種簡潔的排序和輸出哈希的方法。

x = [ [1,23,true], [2,33,false],[3,44,true] ]

由於group_by保持順序,因此您可以在分組之前先進行排序:

p x.sort_by{|x|x[1]}.group_by(&:last) #=> {true=>[[1, 23, true], [3, 44, true]], false=>[[2, 33, false]]}

並且如果您不需要在哈希中保留true / false值:

p  x.sort_by{|x|x[1]}.group_by(&:pop) #=> {true=>[[1, 23], [3, 44]], false=>[[2, 33]]}

在這里,我首先使用Enumerable#group_by將其按真或假分組,然后按v中找到的數組的第二個元素的內容對該散列進行排序。最后,我們調用.to_h或進行散列以獲得您概述的格式以上。

[10] pry(main)> arr
=> [[1, 23, true], [2, 33, false], [3, 44, true]]
[11] pry(main)> arr.group_by { |x| x[2] }.sort_by { |_, v| v.map { |i| i[1] } }.to_h
=> {true=>[[1, 23, true], [3, 44, true]], false=>[[2, 33, false]]}

這是一種方法:

arr = [[1, 44, true], [2, 33, false], [3, 23, true]]

arr.sort_by { |*_,tf| (tf && 0) || 1 }.chunk { |*_,tf| tf }.to_h
  #=> {true=>[[1, 44, true], [3, 23, true]], false=>[[2, 33, false]]}     

如果您希望通過arr[i][1]打破聯系,則:

arr.sort_by { |_,e,tf| [(tf && 0) || 1, e] }.chunk { |*_,tf| tf }.to_h
  #=> {true=>[[3, 23, true], [1, 44, true]], false=>[[2, 33, false]]}

請注意,我已經更改了問題中給出的arr來說明第二點。

暫無
暫無

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

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