Existe-t-il un idiome standard pour comparer les numéros de version? Je ne peux pas simplement utiliser un String compareTo parce que je ne sais pas encore quel sera le nombre maximum de versions ponctuelles. Je dois comparer les versions et faire en sorte que ce qui suit soit vrai:
1.0 < 1.1
1.0.1 < 1.1
1.9 < 1.10
java
comparison
versioning
Bill le lézard
la source
la source
String version = "1.1.2".replace(".", "");
int number = Integer.parseInt(version); // = 112
. Vous pouvez comparer le numéro à un autre et ainsi trouver la version la plus récente. De plus, vous pouvez vérifier si laversion
chaîne correspond à un certain modèle comme\\d+\\.\\d+\\.\\d
pour que le résultat ait au moins 3 chiffres..
caractère et en comparant la longueur de chaque élément. Ensuite, mettez tous les éléments dans une chaîne, puis analysez-le comme int et comparez-le à l'autre version qui a été convertie de la même manièreRéponses:
Tokenize les chaînes avec le point comme délimiteur, puis comparez la traduction entière côte à côte, en commençant par la gauche.
la source
Une autre solution pour cet ancien article (pour ceux que cela pourrait aider):
Éditer:
@daiscog: Merci pour votre remarque, ce bout de code a été développé pour la plateforme Android et comme recommandé par Google, la méthode "correspond" vérifie toute la chaîne contrairement à Java qui utilise un modèle réglementaire. ( Documentation Android - documentation JAVA )
la source
Pattern.compile()
, étant donné que votre logique est appelée avecO(N log N)
complexité.C'est vraiment simple d'utiliser Maven:
Vous pouvez obtenir la bonne chaîne de dépendance pour Maven Artifact à partir de cette page :
la source
Comparable.compareTo
est documenté comme renvoyant "un entier négatif, zéro ou un entier positif", c'est donc une bonne habitude d'éviter de vérifier -1 et +1.Vous devez normaliser les chaînes de version pour pouvoir les comparer. Quelque chose comme
Tirages
la source
Le meilleur pour réutiliser le code existant, prenez la classe ComparableVersion de Maven
avantages:
N'incluez pas de dépendance à maven-artifact car cela entraînera diverses dépendances transitives
la source
assertTrue(new ComparableVersion("1.1-BETA").compareTo(new ComparableVersion("1.1-RC")) < 0)
Exemple:
Production:
la source
Vous vous demandez pourquoi tout le monde suppose que les versions ne sont constituées que d'entiers - dans mon cas, ce n'était pas le cas.
Pourquoi réinventer la roue (en supposant que la version suit la norme Semver)
Installez d'abord https://github.com/vdurmont/semver4j via Maven
Ensuite, utilisez cette bibliothèque
la source
la source
Si vous avez déjà Jackson dans votre projet, vous pouvez utiliser
com.fasterxml.jackson.core.Version
:la source
la source
une sortie:
la source
J'ai écrit une bibliothèque Open Source appelée MgntUtils qui a un utilitaire qui fonctionne avec les versions String. Il les compare correctement, fonctionne avec les gammes de versions, etc. Voici cette bibliothèque javadoc Voir les méthodes
TextUtils.comapreVersions(...)
. Il a été largement utilisé et bien testé. Voici l' article qui décrit la bibliothèque et où l'obtenir. Il est disponible sous forme d' artefact Maven et sur le github (avec sources et JavaDoc)la source
pour mes projets, j'utilise ma bibliothèque de versions communes https://github.com/raydac/commons-version il contient deux classes auxiliaires - pour analyser la version (la version analysée peut être comparée à un autre objet de version car elle est comparable) et VersionValidator qui permet de vérifier la version pour une expression comme
!=ide-1.1.1,>idea-1.3.4-SNAPSHOT;<1.2.3
la source
J'ai créé un utilitaire simple pour comparer les versions sur la plate-forme Android en utilisant la convention de version sémantique . Cela ne fonctionne donc que pour les chaînes au format XYZ (Major.Minor.Patch) où X, Y et Z sont des entiers non négatifs. Vous pouvez le trouver sur mon GitHub .
La méthode Version.compareVersions (String v1, String v2) compare deux chaînes de version. Il renvoie 0 si les versions sont égales, 1 si la version v1 est antérieure à la version v2, -1 si la version v1 est postérieure à la version v2, -2 si le format de la version n'est pas valide.
la source
la source
@ alex post sur Kotlin
usage:
la source
J'ai écrit une petite fonction moi-même.
la source
J'ai écrit une petite bibliothèque Java / Android pour comparer les numéros de version: https://github.com/G00fY2/version-compare
Voici ce qu'il fait essentiellement:
Cet extrait de code n'offre aucune vérification ni gestion des erreurs. A côté de cela, ma bibliothèque prend également en charge les suffixes comme "1.2-rc"> "1.2-beta".
la source
Utilisation de Java 8 Stream pour remplacer les zéros non significatifs dans les composants. Ce code a réussi tous les tests sur interviewbit.com
la source
Comme aucune réponse sur cette page ne gère bien le texte mixte, j'ai créé ma propre version:
Cependant, il est toujours insuffisant pour les cas où vous devez comparer "alpha" et "bêta".
la source
Pour quelqu'un qui va afficher l'alerte de mise à jour forcée en fonction du numéro de version, j'ai une idée suivante. Cela peut être utilisé lors de la comparaison des versions entre la version actuelle de l'application Android et la version de configuration à distance de Firebase. Ce n'est pas exactement la réponse à la question posée mais cela aidera définitivement quelqu'un.
Vous pouvez exécuter ce code en copiant-collant dans https://www.onlinegdb.com/online_java_compiler
la source
la source
Je l'ai fait maintenant et je me suis demandé, est-ce correct? Parce que je n'ai jamais trouvé de solution la plus propre avant la mienne:
Il vous suffit de diviser les versions de chaînes ("1.0.0") comme cet exemple:
Ensuite, vous aurez: {"1", "0", "0"}
Maintenant, en utilisant la méthode que j'ai faite:
Méthode:
En attente de tout commentaire :)
la source
basé sur https://stackoverflow.com/a/27891752/2642478
vous pouvez utiliser comme:
la source
Ce code tente de résoudre ce type de versions de comparaison.
la source
J'ai aimé l'idée de @Peter Lawrey, et je l'ai étendue à d'autres limites:
J'espère que ça aide quelqu'un. Il a réussi tous les cas de test dans interviewbit et leetcode (besoin de décommenter deux lignes dans la fonction compareVersion).
Testé facilement!
la source
la source
Voici une implémentation optimisée:
Résultat:
la source