Gibt es eine Standardsprache zum Vergleichen von Versionsnummern? Ich kann nicht einfach einen geraden String compareTo verwenden, da ich noch nicht weiß, wie viele Punkte maximal freigegeben werden sollen. Ich muss die Versionen vergleichen und Folgendes gilt:
1.0 < 1.1
1.0.1 < 1.1
1.9 < 1.10
java
comparison
versioning
Bill die Eidechse
quelle
quelle
String version = "1.1.2".replace(".", "");
int number = Integer.parseInt(version); // = 112
. Sie können die Nummer mit einer anderen vergleichen und so die aktuellere Version finden. Außerdem können Sie überprüfen, ob dieversion
Zeichenfolge mit einem bestimmten Muster übereinstimmt\\d+\\.\\d+\\.\\d
, damit das Ergebnis mindestens 3-stellig ist..
Zeichen teilen und die Länge der einzelnen Elemente vergleichen. Danach fügen Sie einfach alle Elemente in eine Zeichenfolge ein, analysieren sie dann als int und vergleichen sie dann mit der anderen Version, die auf die gleiche Weise konvertiert wurdeAntworten:
Tokenisieren Sie die Zeichenfolgen mit dem Punkt als Trennzeichen und vergleichen Sie dann die Ganzzahlübersetzung nebeneinander, beginnend von links.
quelle
Eine andere Lösung für diesen alten Beitrag (für diejenigen, denen es helfen könnte):
Bearbeiten:
@daiscog: Vielen Dank für Ihre Bemerkung. Dieser Code wurde für die Android-Plattform entwickelt. Wie von Google empfohlen, überprüft die Methode "Übereinstimmungen" die gesamte Zeichenfolge im Gegensatz zu Java, das ein Regelungsmuster verwendet. ( Android-Dokumentation - JAVA-Dokumentation )
quelle
Pattern.compile()
, da Ihre Logik komplex aufgerufen wirdO(N log N)
.Mit Maven ist das ganz einfach:
Auf dieser Seite finden Sie die richtige Abhängigkeitszeichenfolge für Maven Artifact :
quelle
Comparable.compareTo
dokumentiert wird, dass "eine negative Ganzzahl, eine Null oder eine positive Ganzzahl" zurückgegeben wird. Daher ist es eine gute Angewohnheit, nicht nach -1 und +1 zu suchen.Sie müssen die Versionszeichenfolgen normalisieren, damit sie verglichen werden können. Etwas wie
Druckt
quelle
Um vorhandenen Code am besten wiederzuverwenden, verwenden Sie die ComparableVersion-Klasse von Maven
Vorteile:
Schließen Sie keine Abhängigkeit von Maven-Artefakten ein, da dadurch verschiedene transitive Abhängigkeiten gezogen werden
quelle
assertTrue(new ComparableVersion("1.1-BETA").compareTo(new ComparableVersion("1.1-RC")) < 0)
Beispiel:
Ausgabe:
quelle
Ich frage mich, warum alle davon ausgehen, dass die Versionen nur aus ganzen Zahlen bestehen - in meinem Fall nicht.
Warum das Rad neu erfinden (vorausgesetzt, die Version entspricht dem Semver-Standard)
Installieren Sie zuerst https://github.com/vdurmont/semver4j über Maven
Dann benutzen Sie diese Bibliothek
quelle
quelle
Wenn Sie Jackson bereits in Ihrem Projekt haben, können Sie Folgendes verwenden
com.fasterxml.jackson.core.Version
:quelle
quelle
einige Ausgabe:
quelle
Ich habe eine Open Source-Bibliothek namens MgntUtils geschrieben, die ein Dienstprogramm enthält, das mit String-Versionen funktioniert. Es vergleicht sie korrekt, arbeitet mit Versionsbereichen und so weiter. Hier ist diese Bibliothek javadoc Siehe Methoden
TextUtils.comapreVersions(...)
. Es wurde stark genutzt und gut getestet. Hier ist der Artikel , der die Bibliothek beschreibt und wo man sie bekommt. Es ist als Maven-Artefakt und auf dem Github verfügbar (mit Quellen und JavaDoc).quelle
Für meine Projekte verwende ich meine Commons-Versionsbibliothek https://github.com/raydac/commons-version. Sie enthält zwei Hilfsklassen - zum Parsen der Version (analysierte Version kann mit einem anderen Versionsobjekt verglichen werden, da es vergleichbar ist) und VersionValidator Dies ermöglicht es, die Version auf Ausdrücke wie zu überprüfen
!=ide-1.1.1,>idea-1.3.4-SNAPSHOT;<1.2.3
quelle
Ich habe ein einfaches Dienstprogramm zum Vergleichen von Versionen auf einer Android-Plattform unter Verwendung der Semantic Versioning- Konvention erstellt. Es funktioniert also nur für Zeichenfolgen im Format XYZ (Major.Minor.Patch), bei denen X, Y und Z nicht negative Ganzzahlen sind. Sie finden es auf meinem GitHub .
Die Methode Version.compareVersions (String v1, String v2) vergleicht zwei Versionsstrings. Es gibt 0 zurück, wenn die Versionen gleich sind, 1, wenn Version v1 vor Version v2 liegt, -1, wenn Version v1 nach Version v2 liegt, -2, wenn das Versionsformat ungültig ist.
quelle
quelle
Schrieb selbst eine kleine Funktion. Einfacher Verwenden von Listen
quelle
Ich habe eine kleine Java / Android-Bibliothek zum Vergleichen von Versionsnummern geschrieben: https://github.com/G00fY2/version-compare
Was es im Grunde tut, ist Folgendes:
Dieses Snippet bietet keine Fehlerprüfungen oder -behandlung. Daneben unterstützt meine Bibliothek auch Suffixe wie "1.2-rc"> "1.2-beta".
quelle
Verwenden von Java 8 Stream zum Ersetzen führender Nullen in Komponenten. Dieser Code hat alle Tests auf interviewbit.com bestanden
quelle
Da keine Antwort auf dieser Seite gut mit gemischtem Text umgehen kann, habe ich meine eigene Version erstellt:
Fälle, in denen Sie "Alpha" mit "Beta" vergleichen müssen, sind jedoch immer noch unzureichend.
quelle
Für jemanden, der Force Update Alert basierend auf der Versionsnummer anzeigen wird, habe ich eine folgende Idee. Dies kann verwendet werden, wenn die Versionen zwischen der aktuellen Android-App-Version und der Remote-Konfigurationsversion von Firebase verglichen werden. Dies ist nicht genau die Antwort auf die gestellte Frage, aber dies wird definitiv jemandem helfen.
Sie können diesen Code ausführen, indem Sie ihn in https://www.onlinegdb.com/online_java_compiler einfügen
quelle
quelle
Ich habe es gerade getan und mich gefragt, ob es richtig ist. Weil ich noch nie eine sauberste Lösung gefunden habe als meine:
Sie müssen nur die Zeichenfolgenversionen ("1.0.0") wie in diesem Beispiel aufteilen:
Dann haben Sie: {"1", "0", "0"}
Verwenden Sie nun die Methode, die ich durchgeführt habe:
Methode:
Warten auf Feedback :)
quelle
@ Alex ' Beitrag auf Kotlin
Verwendung:
quelle
basierend auf https://stackoverflow.com/a/27891752/2642478
Sie können wie folgt verwenden:
quelle
Dieser Code versucht, diese Art von Vergleichsversionen aufzulösen.
quelle
Ich mochte die Idee von @Peter Lawrey und erweiterte sie auf weitere Grenzen:
Hoffe es hilft jemandem. Es hat alle Testfälle in Interviewbit und Leetcode bestanden (zwei Zeilen in der compareVersion-Funktion müssen auskommentiert werden).
Leicht zu testen!
quelle
quelle
Hier ist eine optimierte Implementierung:
Ergebnis:
quelle