陣列我有紅寶石的陣列如下排序在紅寶石(特殊情況)
xs = %w(2.0.0.1
2.0.0.6
2.0.1.10
2.0.1.5
2.0.0.8)
等具有的值。我想對數組進行排序,使得最終的結果應該是這樣的:
ys = %w(2.0.0.1
2.0.0.6
2.0.0.8
2.0.1.5
2.0.1.10)
我已經使用array.sort
功能試過,但它"2.0.1.5"
前將"2.0.1.10"
。我不知道爲什麼會發生這種情況
陣列我有紅寶石的陣列如下排序在紅寶石(特殊情況)
xs = %w(2.0.0.1
2.0.0.6
2.0.1.10
2.0.1.5
2.0.0.8)
等具有的值。我想對數組進行排序,使得最終的結果應該是這樣的:
ys = %w(2.0.0.1
2.0.0.6
2.0.0.8
2.0.1.5
2.0.1.10)
我已經使用array.sort
功能試過,但它"2.0.1.5"
前將"2.0.1.10"
。我不知道爲什麼會發生這種情況
使用整數數組定義的lexicographical order的Schwartzian transform(Enumerable#sort_by),並利用(Array#<=>):
sorted_ips = ips.sort_by { |ip| ip.split(".").map(&:to_i) }
能否請你解釋一下更加精心
你不能比較包含數字的字符串:"2" > "1"
,是的,但012因爲字符串按字典順序進行比較,就像字典中的單詞一樣。因此,您必須將ip轉換爲可比較的內容(整數數組):ip.split(".").map(&:to_i)
。例如"1.2.10.3"
轉換爲[1, 2, 10, 3]
。我們稱之爲f
。
您現在可以使用Enumerable#sort
:ips.sort { |ip1, ip2| f(ip1) <=> f(ip2) }
,但請檢查始終是否可以使用更高的抽象Enumerable#sort_by
。在這種情況下:ips.sort_by { |ip| f(ip) }
。您可以將其讀取爲「採取ips
並按照f
映射定義的順序對它們進行排序」。
你能否請詳細解釋一下 –
通過拆分'.'
將數據拆分爲塊。沒有這樣做的標準功能,所以你需要編寫一個自定義的排序來執行此操作。
而且您在2.0.1.5
之前所說的關於2.0.1.10
的行爲是預期的,因爲它將數據作爲字符串並進行ASCII比較,從而導致您看到的結果。
arr1 = "2.0.0.1".split('.')
arr2 = "2.0.0.6".split('.')
的元素都比較和arr1
元素arr2
,在你輸入的所有數據。
只有數字是數組元素?或者點也是?如果您可以將您的數組符號重構爲正確的,我相信我們可以更好地幫助您。 – MurifoX
值都是字符串,因爲它們之間也包含一個點。 –