Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
file1Человек же обычно ожидает увидеть вот это:
file11
file12
file13
file2
file21
file22
file23
file1Из-за этой разницы и появляются костыли вида «file01», а также муки выбора — сколько нулей писать в начале.
file2
file11
file12
file13
file21
file22
file23
Len, Swap, Less.sort.Sort(МояРеализация(коллекция)).StringLess используется в реализации метода Less у хелпера handysort.Strings, в тестах он используется как Strings, потому что пакет тот же. Вы можете написать свой хелпер для сортировки сложных объектов, но везде вместо сравнения через "<" делаете сравнение через handysort.StringLess.// сортировка с применением лексиграфического сравнения строк
sort.Strings(set[b.N])
// сортировка с примененим нашего сравнения строк
sort.Sort(Strings(set[b.N])) // то же самое что и sort.Sort(handysort.Strings(set[b.N]))
// Strings implements the sort interface, sorts an array
// of the alphanumeric strings in decreasing order.
type Strings []string
func (a Strings) Len() int { return len(a) }
func (a Strings) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a Strings) Less(i, j int) bool { return StringLess(a[i], a[j]) }
… помещает 010 перед 09, но это редко становится проблемой на практике…
5.09 или версия 5.010
bool less(char* a, char* b)
{
int lena = strlen(a), lenb = strlen(b);
int i;
for (i=0; i<lena && i<lenb; i++)
{
// Сначала сравним числовые блоки, начинающиеся в данной точке (возможно, нулевой длины).
// num_less - признак того, что первый блок меньше второго
// num_diff - признак того, что они вообще отличаются
// num_block - признак того, что оба блока не нулевой длины
bool num_less = false, num_diff = false, num_block = isdigit(a[i]) && isdigit(b[i]);
for (; isdigit(a[i]) && isdigit(b[i]); i++)
if (a[i] != b[i])
{
num_less = a[i] < b[i];
num_diff = true;
break;
}
// Сравнение длин числовых блоков. Тот блок, который длиннее, представляет собой большее
// по величине число, независимо от num_less.
// НО! Нулевой блок, тем не менее, больше ненулевого (поскольку цифры идут раньше букв)
for (; isdigit(a[i]) && isdigit(b[i]); i++) ;
if (isdigit(a[i])) return !num_block;
if (isdigit(b[i])) return num_block;
// Длины чисел одинаковы (возможно, обе - нулевые).
if (num_diff) return num_less;
// В числовых блоках различий нет (возможно, оба блока были нулевой длины)
if (a[i] != b[i]) return a[i] < b[i];
}
return i == lena && i != lenb;
}
$ go test -bench=.
PASS
BenchmarkStringSort 500 3611235 ns/op
BenchmarkHandyStringSort 100 15821388 ns/op
ok github.com/Xlab/handysort 93.953s
Повторное использование кода в Go на примере