SortPlayers stable multi-key comparator with nil scores
Go
package rank
import "sort"
// Player is a ranked record; Score is optional and nil values sort last.
type Player struct {
Name string
Score *int
}
// SortPlayers orders by score descending, then name ascending, stably.
func SortPlayers(players []Player) {
sort.SliceStable(players, func(i, j int) bool {
a, b := players[i], players[j]
switch {
case a.Score == nil && b.Score == nil:
return a.Name < b.Name
case a.Score == nil:
return false
case b.Score == nil:
return true
case *a.Score != *b.Score:
return *a.Score > *b.Score
default:
return a.Name < b.Name
}
})
}