¿Existe un idioma estándar para comparar números de versión? No puedo usar un String compareTo directo porque aún no sé cuál será el número máximo de lanzamientos de puntos. Necesito comparar las versiones y decir lo siguiente:
1.0 < 1.1
1.0.1 < 1.1
1.9 < 1.10
java
comparison
versioning
Bill el lagarto
fuente
fuente
String version = "1.1.2".replace(".", "");
int number = Integer.parseInt(version); // = 112
. Puede comparar el número con otro y así encontrar la versión más reciente. Además, puede verificar si laversion
cadena coincide con cierto patrón determinado\\d+\\.\\d+\\.\\d
para que el resultado tenga al menos 3 dígitos..
personaje y comparar la longitud de cada elemento. Luego, simplemente coloque todos los elementos en una cadena, luego analícelo como int y luego compárelo con la otra versión que se ha convertido de la misma maneraRespuestas:
Tokenice las cadenas con el punto como delimitador y luego compare la traducción entera de lado a lado, comenzando desde la izquierda.
fuente
Otra solución para esta publicación anterior (para aquellos que podría ayudar):
Editar:
@daiscog: Gracias por su comentario, este código ha sido desarrollado para la plataforma Android y, según lo recomendado por Google, el método "coincide" verifica toda la cadena a diferencia de Java que usa un patrón regulatorio. ( Documentación de Android - documentación de JAVA )
fuente
Pattern.compile()
, dado que su lógica se llama conO(N log N)
complejidad.Es realmente fácil usar Maven:
Puede obtener la cadena de dependencia correcta para Maven Artifact desde esta página :
fuente
Comparable.compareTo
se documenta que devuelve "un entero negativo, cero o un entero positivo", por lo que es un buen hábito evitar comprobar -1 y +1.Debe normalizar las cadenas de versión para poder compararlas. Algo como
Huellas dactilares
fuente
Lo mejor para reutilizar el código existente, tome la clase Marable's ComparableVersion
ventajas:
No incluya la dependencia del artefacto maven, ya que eso extraerá varias dependencias transitivas
fuente
assertTrue(new ComparableVersion("1.1-BETA").compareTo(new ComparableVersion("1.1-RC")) < 0)
Ejemplo:
Salida:
fuente
Preguntándome por qué todo el mundo supone que las versiones solo están compuestas de enteros, en mi caso no fue así.
Por qué reinventar la rueda (suponiendo que la versión siga el estándar Semver)
Primero instale https://github.com/vdurmont/semver4j a través de Maven
Entonces usa esta biblioteca
fuente
fuente
Si ya tiene Jackson en su proyecto, puede usar
com.fasterxml.jackson.core.Version
:fuente
fuente
alguna salida:
fuente
Escribí una biblioteca de código abierto llamada MgntUtils que tiene una utilidad que funciona con versiones de cadenas. Los compara correctamente, funciona con rangos de versiones, etc. Aquí está esta biblioteca javadoc Ver métodos
TextUtils.comapreVersions(...)
. Ha sido muy utilizado y bien probado. Aquí está el artículo que describe la biblioteca y dónde obtenerla. Está disponible como artefacto Maven y en el github (con fuentes y JavaDoc)fuente
para mis proyectos utilizo mi biblioteca de versiones comunes https://github.com/raydac/commons-version , contiene dos clases auxiliares: para analizar la versión (la versión analizada se puede comparar con otro objeto de versión porque es comparable) y VersionValidator que permite verificar la versión para alguna expresión como
!=ide-1.1.1,>idea-1.3.4-SNAPSHOT;<1.2.3
fuente
Creé una utilidad simple para comparar versiones en la plataforma Android usando la convención de versiones semánticas . Por lo tanto, solo funciona para cadenas en formato XYZ (Major.Minor.Patch) donde X, Y y Z son enteros no negativos. Lo puedes encontrar en mi GitHub .
Método Version.compareVersions (String v1, String v2) compara dos cadenas de versión. Devuelve 0 si las versiones son iguales, 1 si la versión v1 es anterior a la versión v2, -1 si la versión v1 es posterior a la versión v2, -2 si el formato de la versión no es válido.
fuente
fuente
@ Alex puesto en Kotlin
uso:
fuente
Escribí una pequeña función yo mismo. Simple usando listas
fuente
He escrito una pequeña biblioteca Java / Android para comparar números de versión: https://github.com/G00fY2/version-compare
Lo que básicamente hace es esto:
Este fragmento no ofrece ninguna comprobación o manejo de errores. Además de que mi biblioteca también es compatible con sufijos como "1.2-rc"> "1.2-beta".
fuente
Uso de Java 8 Stream para reemplazar los ceros a la izquierda en los componentes. Este código pasó todas las pruebas en entrevistasbit.com
fuente
Como ninguna respuesta en esta página maneja bien el texto mixto, hice mi propia versión:
Sin embargo, todavía se queda corto en los casos en los que necesita comparar "alfa" con "beta".
fuente
Para alguien que va a mostrar Force Update Alert según el número de versión, tengo una idea siguiente. Esto se puede usar al comparar las versiones entre la versión actual de la aplicación Android y la versión de configuración remota de Firebase. Esta no es exactamente la respuesta a la pregunta, pero definitivamente ayudará a alguien.
Puede ejecutar este código copiando y pegando en https://www.onlinegdb.com/online_java_compiler
fuente
fuente
Lo hice ahora y me pregunté, ¿es correcto? Porque nunca antes había encontrado una solución más limpia que la mía:
Solo necesita dividir las versiones de cadena ("1.0.0") como este ejemplo:
Entonces tendrá: {"1", "0", "0"}
Ahora, usando el método que hice:
Método:
Esperando cualquier comentario :)
fuente
basado en https://stackoverflow.com/a/27891752/2642478
puedes usar como:
fuente
Este código intenta resolver este tipo de versiones de comparación.
fuente
Me gustó la idea de @Peter Lawrey, y la extendí a otros límites:
Espero que ayude a alguien. Pasó todos los casos de prueba en entrevistabit y leetcode (es necesario descomentar dos líneas en la función compareVersion).
¡Fácilmente probado!
fuente
fuente
Aquí hay una implementación optimizada:
Resultado:
fuente