How do you compare two version Strings in Java? How do you compare two version Strings in Java? java java

How do you compare two version Strings in Java?


Another solution for this old post (for those that it might help) :

public class Version implements Comparable<Version> {    private String version;    public final String get() {        return this.version;    }    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;    }    @Override public int compareTo(Version that) {        if(that == null)            return 1;        String[] thisParts = this.get().split("\\.");        String[] thatParts = that.get().split("\\.");        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;    }}

Version a = new Version("1.1");Version b = new Version("1.1.1");a.compareTo(b) // return -1 (a<b)a.equals(b)    // return falseVersion a = new Version("2.0");Version b = new Version("1.9.9");a.compareTo(b) // return 1 (a>b)a.equals(b)    // return falseVersion a = new Version("1.0");Version b = new Version("1");a.compareTo(b) // return 0 (a=b)a.equals(b)    // return trueVersion a = new Version("1");Version b = null;a.compareTo(b) // return 1 (a>b)a.equals(b)    // return falseList<Version> versions = new ArrayList<Version>();versions.add(new Version("2"));versions.add(new Version("1.0.5"));versions.add(new Version("1.01.0"));versions.add(new Version("1.00.1"));Collections.min(versions).get() // return min versionCollections.max(versions).get() // return max version// WARNINGVersion a = new Version("2.06");Version b = new Version("2.060");a.equals(b)    // return false

Edit:

@daiscog: Thank you for your remark, this piece of code has been developed for the Android platform and as recommended by Google, the method "matches" check the entire string unlike Java that uses a regulatory pattern. (Android documentation - JAVA documentation)


It's really easy using Maven:

import org.apache.maven.artifact.versioning.DefaultArtifactVersion;DefaultArtifactVersion minVersion = new DefaultArtifactVersion("1.0.1");DefaultArtifactVersion maxVersion = new DefaultArtifactVersion("1.10");DefaultArtifactVersion version = new DefaultArtifactVersion("1.11");if (version.compareTo(minVersion) < 0 || version.compareTo(maxVersion) > 0) {    System.out.println("Sorry, your version is unsupported");}

You can get the right dependency string for Maven Artifact from this page:

<dependency><groupId>org.apache.maven</groupId><artifactId>maven-artifact</artifactId><version>3.0.3</version></dependency>


Tokenize the strings with the dot as delimiter and then compare the integer translation side by side, beginning from the left.