我有元素的排序後的數組:基於哈希鍵/值範圍返回子數組?
array = ["A", "B", "C", "D", "E"]
我所限定的範圍內的元素,其中「密鑰」是啓動元件,並且「值」爲結束元素:
range_1 = {"C" => "D"}
range_2 = {"B" => "E"}
我如何編寫代碼來返回基於範圍解析上面的數組的子數組?
result_1 = ["C", "D"]
result_2 = ["B", "C", "D", "E"]
我有元素的排序後的數組:基於哈希鍵/值範圍返回子數組?
array = ["A", "B", "C", "D", "E"]
我所限定的範圍內的元素,其中「密鑰」是啓動元件,並且「值」爲結束元素:
range_1 = {"C" => "D"}
range_2 = {"B" => "E"}
我如何編寫代碼來返回基於範圍解析上面的數組的子數組?
result_1 = ["C", "D"]
result_2 = ["B", "C", "D", "E"]
假設你的數組的元素是唯一:
array = ["A", "B", "C", "D", "E"]
range_1 = {"C" => "D"}
range_2 = {"B" => "E"}
def subarray(array, range)
from, to = range.first
idx_from = array.index(from)
idx_to = array.index(to)
array[idx_from..idx_to]
end
subarray(array, range_1) # => ["C", "D"]
subarray(array, range_2) # => ["B", "C", "D", "E"]
這看起來不錯... :) –
result_1 = array[array.index(range_1.keys.first)..array.index(range_1.values.first)]
result_2 = array[array.index(range_2.keys.first)..array.index(range_2.values.first)]
有一種氣味,你是如何做的:
而是使用類似的:
range_1 = {"C" => "D"}
range_2 = {"B" => "E"}
我會選擇使用真正的範圍:
range_1 = 'C' .. 'D'
range_2 = 'B' .. 'E'
然後,我可以用array
,因爲它是那麼容易了一系列轉換爲連續值的數組分配。
range_1.to_a # => ["C", "D"]
range_2.to_a # => ["B", "C", "D", "E"]
[*range_1] # => ["C", "D"]
[*range_2] # => ["B", "C", "D", "E"]
如果array
值是不是真正連續的,如在本例中,我會使用索引值:
array = ["A", "B", "C", "D", "E"]
range_1 = 2 .. 3
range_2 = 1 .. 4
這使得它易於檢索值:
array = ["A", "B", "C", "D", "E"]
range_1 = 2 .. 3
range_2 = 1 .. 4
array[range_1] # => ["C", "D"]
array[range_2] # => ["B", "C", "D", "E"]
如果您需要從array
作爲象徵性的FO名稱中使用的實際值索引變得越來越難,類似於你現在正在做的事情,但是如果你正在使用網絡前端,那就不錯。用戶的大腦和眼睛是很好的資產。
由於用例不明確,我們不能真正推薦更好的解決方案。我懷疑這是一個情況,你已經決定某種算法是最好的,現在你試圖讓它工作,但是當你感覺房間的角落關閉時,熵會被設置。這是一個基於很多年看代碼,而不是一個簡單的判斷。
但像這樣desn't [ 「A」, 「B」, 「C」, 「d」] [ 「B」 .. 「d」]。我得到了「[]」:不能轉換成字符串整數
別的東西要考慮的是哈希與數組類似,只是它們允許隨機存取更方便地使用values_at
。
考慮一下:
array = %w[a b c d x y z]
hash = Hash[array.map.with_index{ |e, i| [e, i] }]
hash # => {"a"=>0, "b"=>1, "c"=>2, "d"=>3, "x"=>4, "y"=>5, "z"=>6}
哈希不需要整數的價值觀,他們可能是尼爾斯或布爾值,我根據我的需求已經使用了兩種。我在這裏使用它們來更明顯地發生了什麼。最大的收穫是哈希值可以讓我們以任何順序提取內容,只需指定該順序即可。如果它是一個範圍或一組範圍,我們仍然可以按照我們想要的順序提取值。
這是使用一個單一的範圍內的簡單的例子:
hash.values_at(*('a' .. 'd')) # => [0, 1, 2, 3]
hash.values_at(*('x' .. 'z')) # => [4, 5, 6]
這些化合物範圍的例子:
hash.values_at(*('a' .. 'c'), *('x' .. 'z')) # => [0, 1, 2, 4, 5, 6]
hash.values_at(*('x' .. 'z'), *('a' .. 'c')) # => [4, 5, 6, 0, 1, 2]
。注意,在該範圍內的第二被顛倒,並且值反映。
還要注意,範圍被分解成陣列。數組可以來自任何地方,只要元素與哈希中的鍵匹配,就會看到以與數組相同的順序返回的值。而不是與單個鍵/值的哈希
感謝有用的提示。不幸的是,這不能被使用,因爲我沒有連續的數組元素,我需要通過字符串來定義'範圍'。建議'[「A」,「B」,「C」] [1..2]'完美,但類似這樣的不是'[「A」,「B」,「C」,「D」] [ 「B」 .. 「d」]'。我得到'in'[]':無法將字符串轉換爲整數' – flyer
正確,您不能使用alpha範圍,因爲'[]'只支持整數。您的示例數組需要反映您的實際情況;如果你在數組中沒有連續的值,那麼確保注意到這一點。有一些非常有趣的技巧可以在散列和數組切片中使用,而哈希切片並不關心數組中的東西是否有序。值將按照指定鍵的順序檢索。 –
如果你想表達的紅寶石範圍,你應該使用'(「C」 ..「d」)'。即使是以'start'開頭的'H',end:'D'也可以代表數據。 – meagar
我剛剛開始使用Ruby,我喜歡Hash'=>'表示法。看來我也會喜歡範圍表示法。 – flyer
@flyer:如果你擁有的唯一工具是錘子,那麼每個問題看起來就像一個被砸的拇指。 :) –