LINUX.ORG.RU

Человекоинтуитивное сравнение имён файлов C++

 ,


0

1

Есть ли библиотека для такого? Что-то сходу не гуглится.

Алфавитное сравнение не предлагать: оно будет выдавать ложные результаты, например:

«12.txt» < «2.txt»

«alpha_10.txt» < «boo_3.txt»

ну и так далее

могу и сам, конечно, написать, но лень

И чтобы 2 раза не вставать: как тоже самое на bash сделать?

★★★★★

Последнее исправление: next_time (всего исправлений: 2)

А хоть какое-то общеизвестное ПО вообще так сортирует? Человекоинтуиция тут не очень понятная если честно.

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

да, Dolphin по-умолчанию так сортирует, думаю большинство файловых менеджеров это умеют, а для музыкальных плееров это вообще must have

next_time ★★★★★
() автор топика
Ответ на: комментарий от pon4ik

всмысле ? Thunar, другие фм и просмотрщики картинок используют такое сравнение, не всегда, но могут

AKonia ★★
()

Это «версионирующее сравнение», можешь выдрать код из feh, там есть, правда по умолчанию в самом просмотрщике оно выключено, но в исходниках есть

AKonia ★★
()
Последнее исправление: AKonia (всего исправлений: 3)
Ответ на: комментарий от m0rph

Эм, так это именно то, что товарищу не нравится

AKonia ★★
()

Конкретно вот это

«alpha_10.txt» < «boo_3.txt»

не

человекоинтуитивное

anonymous_sapiens ★★★★★
()

Человекоинтуитивное

бред

«alpha_10.txt» < «boo_3.txt»

В каком месте тут что-то интуитивно понятно?

anonymous
()
Ответ на: комментарий от next_time

С датами, пока они в одно формате - тоже будет работать по-идее.

pon4ik ★★★★★
()

Толком непонятно, что ты хочешь, и почему «alpha_10.txt» < «boo_3.txt» – ложный результат. По-моему, так наиболее интуитивно:

$ echo -e "two\n12\n2\nfreaking" | sort -h
freaking
two
2
12
Bagrov ★★★★★
()

man strverscmp не подходит?

И чтобы 2 раза не вставать: как тоже самое на bash сделать?

sort --version-sort, наверное.

xaizek ★★★★★
()
Ответ на: комментарий от Bagrov

Толком непонятно, что ты хочешь, и почему «alpha_10.txt» < «boo_3.txt» – ложный результат.

cool_album_alpha_10.mp3

cool_album_boo_3.mp3

а если так?

next_time ★★★★★
() автор топика
Ответ на: комментарий от xaizek

Сравнил с референсными результатами от автора alphanumsort - выглядит один в один :)

pon4ik ★★★★★
()
Ответ на: комментарий от xaizek

хотелось бы большего, но норм, спасибо

хотя нет, оно судя по всему, тоже не работает правильно, как и сортировка в bash (см. ниже)

next_time ★★★★★
() автор топика
Последнее исправление: next_time (всего исправлений: 3)
Ответ на: комментарий от next_time

Кстати, я забыл, но если ман почитать, то там такой порядок сортировки:

000 < 00 < 01 < 010 < 09 < 0 < 1 < 9 < 10

Они начальные нули особым образом считают. Если хочется без такого поведения, то оно выглядит так:

int
vercmp(const char s[], const char t[])
{
    while (*s != '\0' && *t != '\0') {
        if (isdigit(*s) && isdigit(*t)) {
            const char *orig_s = s, *orig_t = t;
            char *p;

            int num_a = strtol(s, &p, 10);
            s = p;

            int num_b = strtol(t, &p, 10);
            t = p;

            if (num_a != num_b) {
                return num_a - num_b;
            } else if (*orig_s != *orig_t) {
                return *orig_s - *orig_t;
            }
        } else if (*s == *t) {
            ++s;
            ++t;
        } else {
            break;
        }
    }

    return *s - *t;
}
xaizek ★★★★★
()
Ответ на: комментарий от next_time

Я пробовал LC_COLLATE=ru_RU.UTF-8, но чё-то не помогло. Вроде как-то так должно работать.

xaizek ★★★★★
()
Ответ на: комментарий от next_time
cool_album_alpha_10.mp3

cool_album_boo_3.mp3

а если так?

Попробовал скормить sort -h. По-моему, всё логично, аналогия примерно такая: Андрей 1, Андрей 6, Борис 4… Валентина 1…

Или у тебя номера треков идут после названий альбомов и песен? Тогда это весьма неочевидный способ называть файлы, и большинство людей вручную рассортирует их неправильно, если не сформулировать техзадание.

Если тебе нужно вычленить из строки сначала все числа, отсортировать по ним, а во вторую очередь уже сортировать по алфавиту, такое навелосипедить даже легче, чем искать готовое решение. Но, опять же, это весьма неочевидный частный случай, потому что у кого-то получится, что «Brother 2» < «Age of Empires III».

Bagrov ★★★★★
()
Ответ на: комментарий от next_time

Это не интуитивно, а астрально-телепатично. Как алгоритм или интуиция должны угадывать, что число после конкретного слова (конкретной позиции?) это индекс, должный стоять перед ним? Это невозможно в общем виде. Максимум, что ты можешь сделать это порезать строку на токены, переставить их как тебе надо и дальше скормить это нагугленному по словам natural sort. Если и с датами или другими данными такое надо, придется паттерн-детектить их и приводить с натурал-сортируемому виду.

anonymous
()

Человекоинтуитивное и C++ - это из разных галактик. По крайней мере, до изобретения шаблонов.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.