2017년 3월 25일 토요일

String 비교 예제 S/W string 버전으로 증감 검사하기


어느날 갑자기, 필요한 함수가 생각났습니다.
익숙한듯이 코딩을 시작했지만, 어떻게 할지 많이 망설여집니다. 그때 TDD 개발 방법론이 빠른 해결 방법이 될 수 있는데요. TDD library를 포함해야만 TDD가 되는것은 아닙니다.

여기 간단하게 TDD 개념을 이용해서 만들어 봤습니다. 테스트 case 부터 만들고 assertEqual 메소드를 만들었습니다. 만약 testcase가 false가 되면 Exception이 나도록 되어있는 아주 간단한 메소드 입니다.

그리고 나서 코딩을 하기 시작했습니다. 앱의 버전이 다운그레이드되거나 업그레이드 되는지 string을 가지고 비교하는 함수 입니다. "6.0.1","6.0.1-1" 이런 ". -" 가 들어가는 형태만 판단하니 적당히 응용해서 만들면 됩니다.


Java Code
package testProject;

public class CompareVersion {

 public static void main(String[] args) throws Exception {
  final int ERR = -10000;
  assertEqual(CompareVsr("1","1",ERR)==0,true);
  assertEqual(CompareVsr("10000","10000",ERR)==0,true);
  assertEqual(CompareVsr("2","3",ERR)<0,true);
  assertEqual(CompareVsr("1.0","1.0",ERR)==0,true);
  assertEqual(CompareVsr("6.0.1","6.0.1",ERR)==0,true);
  assertEqual(CompareVsr("6.0.1","6.0.2",ERR)<0,true);
  assertEqual(CompareVsr("6.0.1","7.0.1",ERR)<0,true);
  assertEqual(CompareVsr("6.0.1","5.0.1",ERR)>0,true);
  assertEqual(CompareVsr("1234a","abcd",ERR)==ERR,true);
  assertEqual(CompareVsr("6.0.1","7.0",ERR)<0,true);
  assertEqual(CompareVsr("6.0.1","6.0.1-1",ERR)<0,true);
  assertEqual(CompareVsr("6.0.126","7.0",ERR)<0,true);
  assertEqual(CompareVsr("6.123.1","6.12-3.1",ERR)!=ERR,true);
  assertEqual(CompareVsr("6.123.1","6.12-3.1",ERR)>0,true);
  assertEqual(CompareVsr("6.0","6",ERR)==0,true);
  assertEqual(CompareVsr("6.0","6.",ERR)==0,true);
  assertEqual(CompareVsr("1.234.1","1.45.1.1",ERR)>0,true);
  assertEqual(CompareVsr("0.1.234.1","0.1.45.1.1",ERR)>0,true);
  assertEqual(CompareVsr(".1.234.1",".1.45.1.1",ERR)>0,true);
 }

 private static void assertEqual(boolean a,boolean b) throws Exception {
  if(a!=b) {
   System.out.println("assert fail:"+a+","+b);
   throw new Exception(); 
  }
 }

 private static int CompareVsr(String string1, String string2,final int ERR) {
  string1 = string1.trim();
  string2 = string2.trim();
  if( string1.equals(string2) ) return 0;
  double value1;
  double value2;
  try {
   value1 = Double.valueOf(string1);
   value2 = Double.valueOf(string2);
   if( value1 > value2 ){
    return 1;
   }else if( value1 == value2 ){
    return 0;
   }else return -1;
  }catch(Exception a){
   return compareSplit("[\\.]",string1, string2, ERR);
  }
 }

 private static int compareSplit(String pStr, String string1, String string2, final int ERR) {
  int value1;
  int value2;
  String sdigit1[] = string1.split(pStr);
  String sdigit2[] = string2.split(pStr);
  if( sdigit1.length == 0 || sdigit2.length==0 ) return ERR;
  for(int i=0;i<sdigit1.length;i++){
   sdigit1[i] = sdigit1[i].trim();
   sdigit2[i] = sdigit2[i].trim();
   if( sdigit1[i].equals(sdigit2[i]) ) continue;
   
   if( sdigit1[i].contains("-") || sdigit2[i].contains("-") ){
    int ret = compareSplit("-", sdigit1[i], sdigit2[i], ERR);
    if( ret != 0 ) return ret;
   }
   try {
    value1 = Integer.valueOf(sdigit1[i]);   
    value2 = Integer.valueOf(sdigit2[i]);
   }catch(Exception e){
    return ERR;
   }
   if( value1 > value2 ){
    return 1;
   }else if( value1 < value2 ){
    return -1;
   }
  }
  return 0;
 }

}












댓글 없음:

댓글 쓰기