Vergleich von Versionszeichenfolgen, wenn Sie die Verarbeitung zwischen zwei Versionen verzweigen möchten (Java-Implementierung)

Ich wollte die Systemverarbeitung abhängig von der Version des Task-Management-Service ändern, daher habe ich eine Implementierung implementiert, die die beiden Versionszeichenfolgen vergleicht. Es ist eine Methode, die Version als Zeichenfolge zu behandeln, durch einen Punkt zu teilen und dann jeden Teil in eine Ganzzahl umzuwandeln und zu vergleichen.

Was du machen willst

Implementierung

Die Implementierung wurde unter Bezugnahme auf [diese Site] geschrieben (https://stackoverflow.com/questions/198431/how-do-you-compare-two-version-strings-in-java). Für ausführlichere Diskussionen wenden Sie sich bitte an Interessenten.

Ich habe die HashCode-Berechnung selbst implementiert. (Ich weiß nicht, ob das in Ordnung ist)

Version.java


package com.example;

import java.util.Arrays;
import java.util.ArrayList;

public class Version implements Comparable<Version> {
    
        private String version;
    
        private String[] parts;
    
        public final String getVersion() {
            return this.version;
        }
    
        public String[] getParts() {
            return this.parts;
        }
    
        public Version(String version) {
            if(version == null)
                throw new IllegalArgumentException("Version can not be null");
            if(!version.matches("[0-9]+(\\.[0-9]+)*"))
                throw new IllegalArgumentException("Invalid version format");
            this.version = version;
            this.parts = this.getVersion().split("\\.");
        }
    
        @Override public int compareTo(Version that) {
            if(that == null)
                return 1;
            String[] thisParts = this.getParts();
            String[] thatParts = that.getParts();
            int length = Math.max(thisParts.length, thatParts.length);
            for(int i = 0; i < length; i++) {
                int thisPart = i < thisParts.length ?
                        Integer.parseInt(thisParts[i]) : 0;
                int thatPart = i < thatParts.length ?
                        Integer.parseInt(thatParts[i]) : 0;
                if(thisPart < thatPart)
                    return -1;
                if(thisPart > thatPart)
                    return 1;
            }
            return 0;
        }
    
        @Override public boolean equals(Object that) {
            if(this == that)
                return true;
            if(that == null)
                return false;
            if(this.getClass() != that.getClass())
                return false;
            return this.compareTo((Version) that) == 0;
        }
    
        @Override public final int hashCode() {
            ArrayList<Integer> intParts = new ArrayList();
            String[] thisParts = this.getParts();
            for(int i = 0; i < thisParts.length; i++) {
                intParts.add(Integer.parseInt(thisParts[i]));
            }
            Integer[] list = intParts.toArray(new Integer[intParts.size()]);
            return Arrays.hashCode(list);
        }
    }

Ich habe versucht, die Hauptfunktion wie folgt zu verschieben.

Main.java


package com.example;

import com.example.Version;

public class Main {

    public static void main(String[] args) {
        Version a = new Version("1.1");
        Version b = new Version("1.1.1");
        System.out.println(a.compareTo(b)); // return -1 (a<b)
        System.out.println(a.equals(b));    // return false
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());

        Version c = new Version("2.0");
        Version d = new Version("1.9.9");
        System.out.println(c.compareTo(d)); // return 1 (c>d)
        System.out.println(c.equals(d));   // return false
        System.out.println(c.hashCode());
        System.out.println(d.hashCode());

        Version e = new Version("2.06");
        Version f = new Version("2.060");
        System.out.println(e.compareTo(f));  // return -1 (e<f)
        System.out.println(e.equals(f));  // return false

        Version g = new Version("3.3.0");
        Version h = new Version("3.3.0");
        System.out.println(g.compareTo(h));  // return 0 (g==h)
        System.out.println(g.equals(h));  // return true
        System.out.println(g.hashCode());
        System.out.println(h.hashCode());
    }
}

Output


-1
false
993
30784
1
false
1023
31040
-1
false
0
true
32767
32767

Vorläufig dachte ich, es wäre okay, weil es auf diese Weise überleben kann. Eigentlich wollte ich es auch dann verwenden können, wenn es eine Version wie 1.3-SNAPSHOT, 1.3a enthält. .. ..

Referenz / Zitat

Recommended Posts

Vergleich von Versionszeichenfolgen, wenn Sie die Verarbeitung zwischen zwei Versionen verzweigen möchten (Java-Implementierung)
Code, der verwendet wird, wenn Sie Json nur mit Standardbibliotheken in Java (verbesserte Version) verarbeiten möchten. Gson ist nicht erforderlich
Ein Memo, wenn Sie den Zeitteil des Kalenders löschen möchten
Wenn Sie die Methode außerhalb verwenden möchten
[Rails] After-Option nützlich, wenn Sie die Reihenfolge der DB-Spalten ändern möchten
[Java-Tool] Ein nützliches Tool, wenn Sie das IPMSG-Protokoll von PC-A regelmäßig an den angegebenen PC senden möchten.
Wenn Sie Annotation in Java 8 dynamisch ersetzen möchten
Code, der verwendet werden soll, wenn Sie Json nur mit Standardbibliotheken in Java verarbeiten möchten
Ich möchte herausfinden, welche Java-Version die JAR-Datei hat, die ich habe
Verwenden Sie JLine, wenn Sie Tastenanschläge auf der Konsole zeichenweise in Java verarbeiten möchten
Wenn Sie die Hauptzweiginformationen in dem aktuellen Zweig wiedergeben möchten, an dem Sie gerade arbeiten
Ich möchte die Notwendigkeit des Testens beurteilen, indem ich die Unterschiede der Klassendateien beim Refactoring von Java vergleiche.
Wie schreibe ich, wenn ich mit "C language string array" wie argv [] in Ruby-FFI umgehen möchte?
Wechseln Sie die von SDKMAN installierte Java-Version, wenn Sie Verzeichnisse verschieben
Geben Sie die Differenz zwischen jedem Feld zweier Objekte in Java aus
Wenn Sie die Java-Entwicklungsumgebung von Eclipse aus ändern möchten
Ist die von Ihnen verwendete Version von Elasticsearch mit Java 11 kompatibel?
[Java Edition] Geschichte der Serialisierung
[RSpec] Wenn Sie die Instanzvariable des Controllers im Test verwenden möchten [Zuweisungen wird nicht empfohlen]
[Java] Geben Sie in stdin of Process ein
Das erste, was Sie tun müssen, wenn Sie mit Heroku auf GitHub mit Eclipse auf Java zufrieden sein möchten
Aktualisieren Sie JAVA auf die neueste Version auf 1.8.0_144 (beim Herunterladen aus dem Internet und Aktualisieren)
Ich möchte die JSP des offenen Portlets bei der Entwicklung von Liferay kennen
Zusammenfassung der Mittel, wenn Sie mit HTTP unter Android kommunizieren möchten
So finden Sie heraus, welche Java-Version der Klassendatei kompiliert wurde
So ermitteln Sie die Gesamtzahl der Seiten beim Paging in Java
Ich möchte die IP-Adresse erhalten, wenn ich mit Java eine Verbindung zu Wi-Fi herstelle
Ich möchte den Feldnamen des [Java] -Felds erhalten. (Alter Ton)
Ich möchte, dass Sie Enum # name () für den Schlüssel von SharedPreference verwenden
Ausgabe des Buches "Einführung in Java"
So wechseln Sie zwischen mehreren Java-Versionen
Wenn Sie die Testabdeckung privater Methoden in JUnit erfüllen möchten
Unterschied zwischen Java, C # und JavaScript (wie man den Grad der Fettleibigkeit findet)
Ich möchte, dass Sie Scala vorerst als besseres Java verwenden
Eine Geschichte, die die Implementierung der SendGrid-Java-Bibliothek bestätigt, wenn die E-Mail-Zustellung fehlschlägt
[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?
Ich möchte, dass Sie die Geschichte erzählen, dass der Fehler behoben wurde, als Sie das Ladegerät in die Ecke Ihres Kopfes gestochen haben