Comparaison des chaînes de version lorsque vous souhaitez brancher le traitement entre deux versions (implémentation Java)

Je voulais changer le traitement du système en fonction de la version du service de gestion des tâches, j'ai donc implémenté une implémentation qui compare les deux chaînes de version. C'est une méthode pour traiter la version comme une chaîne de caractères, la diviser par un point, puis convertir chaque partie en Integer et comparer.

Chose que tu veux faire

--Par exemple, vous souhaitez brancher le processus selon que la version d'un service est 2.5 ou supérieure et inférieure à 2.5.

la mise en oeuvre

L'implémentation a été écrite en référence à ce site. Pour des discussions plus détaillées, veuillez vous référer à ceux qui sont intéressés.

J'ai implémenté moi-même le calcul de hashCode. (Je ne sais pas si ça va)

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);
        }
    }

J'ai essayé de déplacer la fonction principale comme suit.

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

Pour le moment, je pensais que ça irait parce qu'il semble pouvoir survivre de cette façon. En fait, je voulais pouvoir l'utiliser même s'il contient une version telle que 1.3-SNAPSHOT, 1.3a. .. ..

Référence / citation

Recommended Posts

Comparaison des chaînes de version lorsque vous souhaitez brancher le traitement entre deux versions (implémentation Java)
Code utilisé lorsque vous souhaitez traiter Json avec uniquement des bibliothèques standard en Java (version améliorée) gson inutile
Un mémo lorsque vous souhaitez effacer la partie horaire de l'agenda
Lorsque vous souhaitez utiliser la méthode à l'extérieur
[rails] Option After utile lorsque vous souhaitez modifier l'ordre des colonnes DB
[outil java] Un outil utile lorsque vous souhaitez envoyer régulièrement le journal ipmsg de PC-A au PC spécifié.
Lorsque vous souhaitez remplacer dynamiquement l'annotation dans Java 8
Code à utiliser lorsque vous souhaitez traiter Json en Java avec uniquement des bibliothèques standard
Je veux savoir quelle version de java le fichier jar que j'ai est disponible
Utilisez JLine lorsque vous souhaitez gérer les frappes sur la console caractère par caractère en Java
Lorsque vous souhaitez refléter les informations de la branche principale dans la branche actuelle sur laquelle vous travaillez actuellement
Je veux juger de la nécessité de tester en comparant les différences des fichiers de classe lors de la refactorisation de Java.
Comment écrire lorsque vous voulez gérer un "tableau de chaînes en langage C" comme argv [] dans Ruby-FFI
Changer la version de java installée par SDKMAN lors du déplacement de répertoires
Sortie de la différence entre chaque champ de deux objets en Java
Si vous souhaitez modifier l'environnement de développement Java d'Eclipse
La version d'Elasticsearch que vous utilisez est-elle compatible avec Java 11?
[Édition Java] Histoire de la sérialisation
[RSpec] Lorsque vous souhaitez utiliser la variable d'instance du contrôleur dans le test [attribuer n'est pas recommandé]
[Java] Entrez dans le stdin du processus
La première chose à faire lorsque vous voulez être satisfait d'Heroku sur GitHub avec Eclipse sur Java
Mettez à jour JAVA vers la dernière version vers 1.8.0_144 (lors du téléchargement à partir du Web et de la mise à jour)
Je veux connaître le JSP du portlet ouvert lors du développement de Liferay
Résumé des moyens lorsque vous souhaitez communiquer avec HTTP sur Android
Comment savoir quelle version Java d'un fichier de classe a été compilée
Comment trouver le nombre total de pages lors de la pagination en Java
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
Je veux obtenir le nom de champ du champ [Java]. (Vieux ton d'histoire)
Je veux que vous utilisiez Enum # name () pour la clé de SharedPreference
Sortie du livre "Introduction à Java"
Comment basculer entre plusieurs versions de Java
Si vous souhaitez satisfaire la couverture de test des méthodes privées dans JUnit
Différence entre Java, C # et JavaScript (comment trouver le degré d'obésité)
Je veux que vous utilisiez Scala comme meilleur Java pour le moment
Une histoire confirmant l'implémentation de la bibliothèque Java SendGrid lorsque la livraison du courrier échoue
[Java] Est-il inutile de vérifier "l'identité" dans l'implémentation de la méthode equals ()?
Je veux que vous racontiez que l'erreur a été résolue lorsque vous avez poignardé le chargeur dans le coin de la tête