java 버전 번호 비교 기능 구현

클라이언트와 관련된 시스템에서는 버전 번호를 비교하는 기능이 자주 필요하지만 버전 번호를 비교하는 것은 문자열 비교 방식에 따라compareTo 같은 방법을 완전히 사용할 수 없다.
따라서 버전 번호의 공통 규칙을 정리하고 비교 알고리즘을 설계하여 공통 방법으로 봉인해야 합니다.
일반적인 버전 번호는 1.3.20.8, 6.82.20160101, 8.5a/8.5c 등이다.
일반적인 규칙은 먼저 버전 문자열을 점호에 따라 분할한 다음에 메인 버전과 메인 버전을 비교하고 이 버전과 이 버전을 비교하는 것이다. 이렇게 순서에 따라 한 단계씩 뒤로 비교하고 크기가 나눌 때까지 비교한다.
주의해야 할 것은 버전 번호를 비교하는 많은 방법들이 먼저 문자열을 int나 double 형식으로 바꾸는 것이다. 이렇게 하면 반드시 통용되는 것은 아니다. 왜냐하면 자모, 예를 들어 8.5c와 같은 버전 번호를 포함할 수 있기 때문이다.
통용되는 방식은 여전히 분할된 문자열을 문자열로 비교하지만, 문자열을 비교하기 전에 먼저 비트를 비교한다.
버전 번호를 비교하는 방법의 예:

/** 
 *  , , , 0 
 * @param version1 
 * @param version2 
 * @return 
 */ 
public static int compareVersion(String version1, String version2) throws Exception { 
  if (version1 == null || version2 == null) { 
    throw new Exception("compareVersion error:illegal params."); 
  } 
  String[] versionArray1 = version1.split("\\.");// , "."; 
  String[] versionArray2 = version2.split("\\."); 
  int idx = 0; 
  int minLength = Math.min(versionArray1.length, versionArray2.length);//  
  int diff = 0; 
  while (idx < minLength 
      && (diff = versionArray1[idx].length() - versionArray2[idx].length()) == 0//  
      && (diff = versionArray1[idx].compareTo(versionArray2[idx])) == 0) {//  
    ++idx; 
  } 
  // , , , , ; 
  diff = (diff != 0) ? diff : versionArray1.length - versionArray2.length; 
  return diff; 
} 
주의: 이 중 split 방법은 정규 일치 표현식으로 들어가서'.'을 사용할 수 없습니다.("."정규 표현식에 일치하는 값) 을 사용하려면\\.점호에 따라 분할하는 셈이다.
이렇게 하면 먼저 하위 직렬수 그룹으로 나누어 하위 버전 번호를 하나씩 비교하고 하위 버전 번호를 비교할 때 먼저 비트를 비교하고 비트가 큰 것은 크며 비트가 같을 때 문자열 비교 방식으로 비교한다.
만약 모두 비교가 끝난 후에 어느 버전 번호가 더 많은 하위 버전 번호, 즉 분할된 수조의 길이, 하위 버전 번호가 있는 것이 큰지 다시 한 번 봅시다.
이렇게 하면 여러 가지 상황을 비교적 완벽하게 고려하고 출판 본호의 크기를 비교한다.알파벳 접미사가 있는 것도 사용할 수 있다.
예를 들어'9.9','10.8.8.6'을 문자열로 비교하면 전자가 크고 후자가 작으며 분명히 잘못된 것이다.분할 후 첫 번째 메인 버전 9와 10을 비교한 결과 비트에서 후자가 크다는 것을 알 수 있다.
또한,'9.9b','9.8a'등도 적용되며, int나double로 전환하는 방법으로는 적용되지 않는다.

좋은 웹페이지 즐겨찾기