Если вы не слишком много номеров строк, вероятно, можно получить все строки и хранить их в срезе. Затем вы можете отсортировать эти записи в ОЗУ, выполнив команду sort.Interface и вызвав функцию sort.Sort. Взгляните на источник sort.IntSlice, если вам нужен пример для этого.
Трудная часть, вероятно, определяет буквенно-цифровой порядок сортировки. Я не знаю точное его определение (и я не смог найти его за это короткое время), но я все равно попытался его реализовать. Вот код, который вы можете использовать для менее методы:
package main
import "log"
func less(a, b string) bool {
i, j := 0, 0
for i < len(a) && j < len(b) {
numeric, numA, numB := false, 0, 0
for i < len(a) && a[i] >= '0' && a[i] <= '9' {
numA = numA*10 + int(a[i]) - '0'
numeric = true
i++
}
for j < len(b) && b[j] >= '0' && b[j] <= '9' {
numB = numB*10 + int(b[j]) - '0'
numeric = true
j++
}
if numeric {
if numA != numB {
return numA < numB
}
continue
}
if a[i] != b[j] {
return a[i] < b[j]
}
i++
j++
}
return i == len(a) && j != len(b)
}
var tests = []struct {
a, b string
r1, r2 bool
}{
{"bar", "foo", true, false},
{"foo100", "foo10", false, true},
{"foo100a", "foo100b", true, false},
{"foo", "foo", false, false},
{"100", "100", false, false},
{"foo5", "foo12", true, false},
{"foo5", "fo3", true, false},
{"foo", "foo8", true, false},
}
func main() {
for i := range tests {
if less(tests[i].a, tests[i].b) != tests[i].r1 {
log.Fatalf("test %d failed", i)
}
if less(tests[i].b, tests[i].a) != tests[i].r2 {
log.Fatalf("reverse test %d failed", i)
}
}
}
я не уверен, если код достаточно для вас, или если вам нужно обрабатывать более сложные случаи, но это могло бы обеспечить, по крайней мере хорошее отправной точкой для ваших собственных модификаций.
глава 21,1 глава 21,2 глава 21,10 это должно быть результатом –
@AshvinSingh: Да, вы уже сказали нам, что и так работает алгоритм ИСО/МЭК 14651.Если сортировать строки по полю последовательности, вы получите chap21.1, chap21.10, chap21.2, которые не то, что вы хотите. Однако, если сортировать строки с помощью ключа сортировки последовательностей, построенного из поля последовательности с помощью функции SequenceKey, вы получите chap21.1, chap21.2, chap21.10, который вы хотите. Если вы все еще не понимаете этого, обновите свой вопрос, чтобы предоставить подробное объяснение с примерами того, почему вы считаете, что алгоритм ISO/IEC 14651 не работает. – peterSO
@peterSO Отличный ответ! Является ли это 'datastore:" - "' GAE конкретным? Я не понимаю его использования. Не могли бы вы рассказать об этом? – topskip