Альтернатива Java для 'sort -V' - PullRequest
       1

Альтернатива Java для 'sort -V'

0 голосов
/ 16 февраля 2012

Я ищу альтернативу чистой Java для команды оболочки: sort -V. Я ищу класс Comparator, который можно просто подключить. Команда sort -V просто сортирует файлы с версией системы (т.е. 3.2.0-11 на 10 больше, чем 3.2.0-1, а не на .1 больше).

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Однажды я написал общий компаратор "как человек". У меня нет кода для показа, но идея состояла в том, чтобы разбить каждую строку следующим образом:

fragments = empty string collection
buffer = first character of the string
if character is digit, mode = NUMBER, else mode = TEXT
while there are characters left
   c = next character
   if c is digit and mode is NUMBER, add character to buffer
   else if c is not a digit and mode is TEXT, add character to buffer
   else
     add contents of buffer (as string) to the fragments collection,
     flip mode from TEXT to NUMBER or vice versa
     buffer = c
   end if
end while
add remaining contents of buffer to fragments

Итак, теперь у вас есть список подстрок, содержащих чередующиеся фрагменты числа и нечисловые фрагменты. (Например, something-1.0.26.jar станет { 'something-', '1', '.', '0', '.', '26', '.jar' })

Если вы сделаете это для обеих строк, вы можете написать компаратор, который сравнивает фрагменты пар один за другим: если оба числа, проведите численное сравнение, если оба текста, сравнение строк, если одно число, другой - текст, номер на первом месте.

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

0 голосов
/ 17 февраля 2012

Новичок:

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

3.2.0-11 становится 4-х, 3, 2, 0 и 11, тогда как 3.2.0-1 становится 3, 2, 0 и 1.

Предполагая, что вы превратили их в массивы, вы сравниваете src [3]

Это можно легко сделать в вашем случае с String.split (".-"), затем вызвать Integer.getInteger (src [n]) накаждая запись в результирующем массиве.

Advanced:

Теперь, если вам нужна версия "Advanced", я могу показать вам небольшую хитрость.Если вы возьмете свои значения и объедините их в один длинный - что-то вроде этого:

long l=src[3] << (16 * 3) + src[2] << (16 * 2) + src[1] << (16 * 1) + src[0];

Это объединит все отдельные поля в один длинный, который можно сравнить.(это потребует небольшого приведения И первое поле не может перейти поверх версии # 32767, все остальные могут перейти к 65535)

Если вы уверены, что ни одно из чисел не превысит 255, вы можете даже сдвинуться накратно 8 вместо 16 и упаковывает их в целое число (или long, который может обрабатывать номер версии максимум с 7 полями - или 8, если первое не превышает 127)

Приятной частью этой техники является то, что вы берете ее от 4 сравнений до 1, и вы переносите только одно значение.

Эксперт:

Кстати, версия "Эксперт", обернуть все это внутри класса, так что вам действительно все равно, как это реализовано.Что-то с интерфейсом, подобным следующему:

class VersionNo implements Comparable {
    public VersionNo(String version, File originalFileObject);
    public int compareTo(VersionNo target);
    public String toString();
    public File getOriginalFileObject();
}

Теперь вы можете изменить свою реализацию в любое время и не влиять на что-либо еще в вашей программе - вам даже не нужно рассматривать отдельный компаратор,они должны автоматически сортироваться при вставке в любую уважающую себя упорядоченную структуру данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...