La función de comparar los números de versión a menudo se necesita en los sistemas que involucran el lado del cliente, pero la comparación de números de versión no se puede usar por completo de acuerdo con los métodos de comparación de cadenas como Compareto;
Esto requiere que resumamos las reglas comunes de los números de versión, diseñemos un algoritmo de comparación y lo encapsulemos en un método general para usar:
Los números de versión habituales son: 1.3.20.8, 6.82.20160101, 8.5a/8.5c, etc.;
La regla general es dividir primero la cadena de versión por número de punto, luego comparar la versión principal con la versión principal y comparar esta versión con esta versión, para que pueda compararse una por una en secuencia hasta que el tamaño se divide;
Vale la pena señalar que muchos métodos para comparar los números de versión convierten la cadena en int o de tipo doble primero, lo que puede no ser universal porque puede contener letras, como 8.5c;
La forma general es comparar la cadena dividida como una cadena, pero antes de comparar la cadena, compare primero el número de bits;
Ejemplo de un método para comparar números de versión:
/*** Compare el tamaño del número de versión. Si el primero es grande, devuelve un número positivo, el segundo es grande y devuelve un número negativo, y si es lo mismo, return 0 * @param versión1 * @param versión2 * @return */ public static int compareVersion (string versión1, string version2) lanza excepción {if (versión1 == null || versión2 == null) {droga nueva excepción ("error de comparación de comparación: parámetros ilegales:"); ");"); } String [] VersionArray1 = versión1.split ("//.") ;// Tenga en cuenta que esta es una coincidencia regular, y". " no se puede usar; String [] versionArray2 = versión2.split ("//."); int idx = 0; int minLength = Math.min (VersionArray1.length, versióneRray2.Length); // Obtener el valor de longitud mínima int diff = 0; while (idx <minLength && (diff = versión deRAY1 [idx] .length () - versionArray2 [IDX] .length ()) == 0 // Compare la longitud primero && (diff = versionArray1 [IDX] .compareto (versionArray2 [IDX]) == 0) {// Compara los caracteres ++ IDX; } // Si el tamaño se ha dividido, se devolverá directamente. Si el tamaño no se ha dividido, compare el número de bits nuevamente. La subversión del número es grande; diff = (diff! = 0)? diff: versionArray1.length - versionArray2.length; return diff; } Nota: El parámetro del método dividido es una expresión de coincidencia regular y no se puede usar como ". ("." ("." Para que coincida con cualquier valor en la expresión regular). Debe usar "//." Para considerarse dividido por número de punto;
De esta manera, primero divídese en matrices de subcadena y luego compare los números de subversión uno por uno. Al comparar los números de subversión, primero compare el número de dígitos. Si el número de dígitos es grande, el número de dígitos será grande. Cuando el número de dígitos es el mismo, compare de acuerdo con el método de comparación de cadenas;
Si se completan todas las comparaciones (se compara uno de los números de versión), entonces mire qué número de versión tiene más números de subversión, es decir, la longitud de la matriz dividida y los números de subversión son más grandes;
De esta manera, varias situaciones se consideran más a fondo y se compara el tamaño del número de versión; También se pueden usar sufijos de letras;
Por ejemplo, "9.9", "10.8.8.6", si se compara directamente por cadena, el primero será más grande y el segundo será más pequeño, lo que obviamente es incorrecto; Después de la segmentación, se comparan los primeros principales versión 9 y 10, y a partir de los dígitos, el resultado será grande;
Por ejemplo, "9.9b", "9.8a", etc., también son aplicables, pero no es aplicable si se usa el método de convertir a int o doble.