我已經看到用其他幾種語言提出的這個問題,每種語言都有很好的答案。IE
如何按行長度對檔案進行排序,然后按字母順序為第二個鍵排序?
如何按字串長度和字母順序排序?
按字母順序和長度對字串進行排序?
我無法在 Golang 中弄清楚:/假設我有這個串列:
2 22 2H 2J 2J2 2J3 2J322422 2J322423 2J33 2M 2P 2W 2X
我希望排序的輸出是:
2 22 2H 2J 2M 2P 2W 2X 2J2 2J3 2J33 2J322422 2J322423
我在 Golang 中嘗試了一些東西,但無法讓它作業。
// Log
t.Log.Println(values)
// Sort values alphabetically
sort.Strings(values)
// Sort values by length
sort.Slice(values, func(i, j int) bool {
return len(values[i]) < len(values[j])
})
// Log
t.Log.Println(values)
uj5u.com熱心網友回復:
如果排序兩次,則第二次排序不會考慮第一次排序的規則。
您必須排序一次,并且排序規則必須包含您想要排序的所有屬性。
所以主要是你想按長度排序。如果 2 個元素具有相同的長度,則按自然順序。您可以通過首先檢查less()函式中的長度來實作這一點。如果它們不相等,則按長度排序是決定結果的因素。如果它們相等,你就訴諸自然秩序。
list := strings.Split("2 22 2H 2J 2J2 2J3 2J322422 2J322423 2J33 2M 2P 2W 2X", " ")
fmt.Println(list)
sort.Slice(list, func(i, j int) bool {
l1, l2 := len(list[i]), len(list[j])
if l1 != l2 {
return l1 < l2
}
return list[i] < list[j]
})
fmt.Println(list)
這將輸出(在Go Playground上嘗試):
[2 22 2H 2J 2J2 2J3 2J322422 2J322423 2J33 2M 2P 2W 2X]
[2 22 2H 2J 2M 2P 2W 2X 2J2 2J3 2J33 2J322422 2J322423]
您可以擴展此邏輯以按任意數量的屬性(或規則)進行排序。您首先檢查更高優先級的規則,如果它們定義了順序差異,則回傳它們指定的順序(i第 th元素是否小于jth 的資訊)。如果它們不區分所討論元素的位置,則繼續使用優先級較低的規則。
uj5u.com熱心網友回復:
您需要一個比較器函式,它可以根據您定義的整理規則進行正確比較。
要對一段字串進行排序,首先按長度,然后按字母順序,您應該這樣做:
strs := []string{
"Zulu" , "Yankee" , "X-Ray" , "Whiskey" , "Victor" ,
"Ulysses" , "Tango" , "Sierra" , "Romeo" , "Quebec" ,
"Poppa" ,"Oscar" , "Nancy" , "Mike" , "Lima" ,
"Kilo" , "Juliet" , "India" , "Hotel" , "Golf" ,
"Foxtrot" , "Echo" , "Delta" , "Charlie" , "Bravo" ,
"Alpha" ,
}
byLengthThenAlphabetically := func(i int, j int) bool {
x := strs[i]
y := strs[j]
deltaLength := len(x) - len(y)
return deltaLength < 0 || (deltaLength == 0 && x < y)
}
sort.Slice(strs, byLengthThenAlphabetically )
在https://play.golang.org/p/nL2bTDlWM49的 Go Playground 中嘗試
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/350296.html
