сортировка / упорядочение по версии программного обеспечения - алгоритм / реализация - PullRequest
0 голосов
/ 26 октября 2011

Я ищу способ упорядочить / отсортировать набор строк, определяющих версии программного обеспечения, в следующем формате: xxx (например, 1.3.12).

Эти строки находятся в базе данных (mysql), но я не уверен, что это вообще актуально.

Одна идея, о которой я могу подумать, - это сделать строковое -> целочисленное (или плавающее) преобразование, а затем отсортировать набор по целочисленному индексу.Однако я не уверен, возможно ли это.

Также я ищу другие идеи.

Спасибо

ОБНОВЛЕНИЕ: Я только думал о настройкечисло, которое представляет максимальную версию, которую я мог реализовать (и под версией я имею в виду основную версию, вспомогательную версию, ревизию).например, я выбираю число 300, поэтому максимальная версия будет 299.299.299, поэтому .. когда я конвертирую, я могу сделать что-то вроде этого: мажор * пау (300,2) + минор * пау (300,1) + ревизия *pow (300,0)

Все еще открыт для идей.

Ответы [ 4 ]

3 голосов
/ 26 октября 2011

Не используйте многоточечные строки в качестве строк - у вас будет большая головная боль при сравнении его значения

В вашем случае вы можете (должны?) Расширить версию до 4-байтовой строки (с завершающим 0) и использовать функции, связанные с IP4 (из внешнего интерфейса или встроенного MySQL)

С Руководство по MySQL

INET_ATON (выражение)

Учитывая точечно-квадратичное представление сетевого адреса IPv4 в виде строка, возвращает целое число, представляющее числовое значение адрес в сетевом порядке байтов (big endian). INET_ATON () возвращает NULL если он не понимает своего аргумента.

mysql> SELECT INET_ATON ('10 .0.5.9 '); -> 167773449

Для этого примера возвращаемое значение рассчитывается как 10 × 2563 + 0 × 2562 + 5 × 256 + 9.

INET_ATON () может или не может вернуть ненулевой результат для краткого IP адреса (такие как «127.1» как представление «127.0.0.1»). Из-за этого INET_ATON () a не должен использоваться для таких адресов.

Примечание:

Для хранения значений, сгенерированных INET_ATON (), используйте столбец INT UNSIGNED а не INT, который подписан. Если вы используете подписанный столбец, значения соответствует IP-адресам, для которых первый октет больше 127 не может быть сохранено правильно. См. Раздел 10.6, «Вне диапазона и обработка переполнения ».

inet_ntoa (выражение)

Учитывая числовой сетевой адрес IPv4 в порядке байтов в сети, возвращает пунктирное представление адреса в виде двоичной строки. INET_NTOA () возвращает NULL, если он не понимает своего аргумента.

0 голосов
/ 08 июня 2016

Имея ту же проблему, я получаю следующее решение для аналогичного случая:

select *
from Softwareedition
order by Softwareedition.IsMostRecentVersion DESC,
INET_ATON(
    CASE (LENGTH(Softwareedition.VersionNumber) - LENGTH(REPLACE(Softwareedition.VersionNumber, ".", "")))
        WHEN 1 then concat(Softwareedition.VersionNumber,".0.0")
        WHEN 2 then concat(Softwareedition.VersionNumber,".0")
        ELSE Softwareedition.VersionNumber
    END) DESC,
Softwareedition.Name DESC
0 голосов
/ 26 октября 2011

Я могу дать только псевдокод без языка, но ... Используйте SUBSTRING_INDEX () в mysql или аналогичную функцию на другом языке, чтобы разбить строку, используя. для разделителя. Затем используйте набор вложенных условных выражений if..then для сравнения строк типа

if(substr1<substr2) return str2;
elseif(subrtr1>substr2) return str1;
elseif(substr1 = substr2)
  if(substr1b<substr2b) return str2;
  elseif(subrtr1b>substr2b) return str1;
  elseif(substr1b = substr2b)

и т.д ....

Куча это еще один способ сделать это. Определите сравнение как функцию compare (). затем добавьте значения и дайте куче отсортировать их.

0 голосов
/ 26 октября 2011

Вы можете сохранить эти значения как VARCHAR или CHAR, а затем просто добавить ORDER BY ... DESC в конец вашего запроса, чтобы получить последнюю версию вверху или оставить часть DESC (MySQL по умолчанию ASC по умолчанию) вполучите самую раннюю версию вверху

Псевдокод:

SELECT * FROM Table WHERE xxx ORDER BY Version DESC
...