Существует ли стандартная идиома для сравнения номеров версий? Я не могу просто использовать прямое сравнение String, потому что я пока не знаю, какое будет максимальное количество релизов. Мне нужно сравнить версии и справедливо следующее:
1.0 < 1.1
1.0.1 < 1.1
1.9 < 1.10
java
comparison
versioning
Билл Ящерица
источник
источник
String version = "1.1.2".replace(".", "");
int number = Integer.parseInt(version); // = 112
. Вы можете сравнить число с другим и, таким образом, найти более свежую версию. Кроме того, вы можете проверить, соответствует лиversion
строка какому-то определенному шаблону, например,\\d+\\.\\d+\\.\\d
чтобы результат имел как минимум 3 цифры..
символ и сравнив длину каждого элемента. После этого просто поместите все элементы в одну строку, затем проанализируйте ее как int, а затем сравните ее с другой версией, которая была преобразована таким же образомОтветы:
Токенизируйте строки с точкой в качестве разделителя, а затем сравнивайте целочисленный перевод рядом, начиная слева.
источник
Другое решение для этого старого поста (для тех, которые могут помочь):
Редактировать:
@daiscog: Спасибо за ваше замечание, этот кусок кода был разработан для платформы Android, и, как рекомендовано Google, метод «соответствует» проверяет всю строку в отличие от Java, который использует нормативный шаблон. ( Документация Android - документация JAVA )
источник
Pattern.compile()
, учитывая, что ваша логика вызывается соO(N log N)
сложностью.С Maven это действительно легко:
Вы можете получить правильную строку зависимости для артефакта Maven на этой странице :
источник
Comparable.compareTo
задокументировано, что оно возвращает «отрицательное целое число, ноль или положительное целое число», поэтому рекомендуется избегать проверки на -1 и +1.Вам необходимо нормализовать строки версий, чтобы их можно было сравнивать. Что-то вроде
Печать
источник
Лучше всего повторно использовать существующий код, воспользуйтесь классом Maven ComparableVersion
преимущества:
Не включайте зависимость от maven-артефакта, так как это вызовет различные переходные зависимости
источник
assertTrue(new ComparableVersion("1.1-BETA").compareTo(new ComparableVersion("1.1-RC")) < 0)
Пример:
Вывод:
источник
Интересно, почему все предполагают, что версии состоят только из целых чисел - в моем случае это не так.
Зачем изобретать велосипед (если версия соответствует стандарту Semver)
Сначала установите https://github.com/vdurmont/semver4j через Maven
Тогда используйте эту библиотеку
источник
источник
Если у вас уже есть Джексон в вашем проекте, вы можете использовать
com.fasterxml.jackson.core.Version
:источник
источник
некоторый вывод:
источник
Я написал библиотеку с открытым исходным кодом под названием MgntUtils, в которой есть утилита, которая работает с версиями String. Он правильно сравнивает их, работает с диапазонами версий и пр. Вот эта библиотека javadoc Смотрите методы
TextUtils.comapreVersions(...)
. Он был интенсивно использован и хорошо проверен. Вот статья, которая описывает библиотеку и где ее взять. Он доступен как артефакт Maven и на github (с исходниками и JavaDoc)источник
для своих проектов я использую свою библиотеку commons-version https://github.com/raydac/commons-version, которая содержит два вспомогательных класса - для анализа версии (проанализированную версию можно сравнить с другим объектом версии, поскольку она сопоставима) и VersionValidator который позволяет проверить версию для некоторого выражения, как
!=ide-1.1.1,>idea-1.3.4-SNAPSHOT;<1.2.3
источник
Я создал простую утилиту для сравнения версий на платформе Android с использованием соглашения о семантическом управлении версиями . Поэтому он работает только для строк в формате XYZ (Major.Minor.Patch), где X, Y и Z являются неотрицательными целыми числами. Вы можете найти его на моем GitHub .
Метод Version.compareVersions (String v1, String v2) сравнивает две строки версии. Возвращает 0, если версии равны, 1, если версия v1 предшествует версии v2, -1, если версия v1 более поздняя, чем версия v2, -2, если формат версии недопустим.
источник
источник
@ alex сообщение на Kotlin
использование:
источник
Я сам написал небольшую функцию. Упрощенный, используя списки
источник
Я написал небольшую библиотеку Java / Android для сравнения номеров версий: https://github.com/G00fY2/version-compare
Что это в основном делает это:
Этот фрагмент не предлагает никаких проверок ошибок или обработки. Кроме того, моя библиотека также поддерживает суффиксы, такие как "1.2-rc"> "1.2-beta".
источник
Использование Java 8 Stream для замены начальных нулей в компонентах. Этот код прошел все тесты на интервьюbitbit.com
источник
Поскольку ни один ответ на этой странице не обрабатывает смешанный текст, я сделал свою собственную версию:
Это все еще не соответствует случаям, когда вам нужно сравнить «альфа» с «бета».
источник
Для тех, кто собирается показывать оповещение об обновлении в зависимости от номера версии, у меня есть следующая идея. Это может быть использовано при сравнении версий между текущей версией Android-приложения и версией удаленной конфигурации Firebase. Это не совсем ответ на заданный вопрос, но это определенно поможет кому-то.
Вы можете запустить этот код, вставив копию в https://www.onlinegdb.com/online_java_compiler
источник
источник
Я сделал это прямо сейчас и спросил себя, правильно ли это? Потому что я никогда не нашел более чистого решения, чем мое:
Вам просто нужно разделить строковые версии ("1.0.0"), как в этом примере:
Тогда у вас будет: {"1", "0", "0"}
Теперь, используя метод, который я сделал:
Метод:
Жду любых отзывов :)
источник
на основе https://stackoverflow.com/a/27891752/2642478
Вы можете использовать как:
источник
Этот код пытается разрешить этот тип сравнения версий.
источник
Мне понравилась идея от @Peter Lawrey, и я расширил ее до следующих пределов:
Надеюсь, это кому-нибудь поможет. Он прошел все тестовые случаи в интервьюbit и leetcode (необходимо раскомментировать две строки в функции CompareVersion).
Легко проверяется!
источник
источник
Вот оптимизированная реализация:
Результат:
источник