우아아우왕
42
2020-11-04 23:19:23 작성 2020-11-04 23:20:32 수정됨
6
265

자바 문자열 비교관련해서 질문입니다.


안녕하세요. 자바를통해 문자열 비교를위해 코딩하는 중의문점이있어서 문의드립니다.


해당내용은 일단 회사 정책서버의 버전이있습니다. 1.2.1 , 1.2.2 .... 1.3.10 요런식으로

패치가되면 뒤에를올려서  버전을 표시해주고있는데요.  이번에해야할게  해당 버전을 체크하여 1.2.10 버전

이상만 기능동작을 위해 분기를 하고있는데요. 해당정보는 일단 문자열입니다.

처음에는 아무생각없이 compareTolgnoreCase를 비교를했습니다. 그럼 당연히 서버 버전이 1.2.9버전이 들어오게되면

 1.2.10보다 낮지만  문자열 비교기떄문에  1.2.9버전이 크다고 나오겠죠.. 그래서

해당 replace를이용 .을 제거해주고 스트링을 인트형으로 형변환하여 비교를 했습니다.

이럴경우이는 1.2.9  버전이들어오면 129 < 1210 이되기때문에 상관이없지만  서버버전이 1.3.1이들어오게되면 

1.3.1이 최신버전이지만 131 < 1210  이되어버려 조건이되버려 맞지않게되었는데

선배님들은 서버 및 제품의 버전을 관리하실때  어떻게 비교를하시나요


0
  • 답변 6

  • Frudy
    6k
    2020-11-04 23:29:39 작성 2020-11-04 23:31:07 수정됨

    음.. 저라면 dot으로 split하고 [1, 2, 10]이랑 [1, 3, 0] 이거 2개 비교하면서

    배열 서로 같은 인덱스로 순회하면서 최초로 크거나 작은게 발견됬을 때를 기준으로 할거같아요.


    1 vs 1 ==> 서로같음

    2 vs 3 ==> 3이 더 큼 이후 순회 중지


    알고리즘을 따로 배운적없이 그냥 문득 생각난 방법이에요.

    이 방법의 성능이 어느정도인지는 잘 모르겠습니다.

  • RWB
    408
    2020-11-04 23:44:48

    버전관리야 여러 방법이 있겠다만, 질문자분 같은 문제의 경우 숫자를 소수점으로 변경하면 문제없이 비교가 가능할 것 같습니다.


    만약, 1.3.1버전과 1.2.10버전의 경우 단순 정수형으로 비교하면

    131 < 1210

    위와 같은 산식이 되겠지만, 소수점으로 비교하면

    1.31 > 1.21

    위와 같이 되어 현재 구조를 크게 해지치 않고 버전관리를 유지할 수 있을 것 같습니다.


    // 소스 구조를 모르니, 정수로 변환한 버전은 변수로 대체합니다.
    int old = 1210;
    int recent = 131;
    
    double oldVer = old / Math.pow(10, (int) Math.log10(old) - (int) Math.log10(Integer.parseInt(oldStr.split("\\.")[0])));
    double recentVer = recent / Math.pow(10, (int) Math.log10(recent) - (int) Math.log10(Integer.parseInt(recentStr.split("\\.")[0])));
    
    if (recentVer > oldVer)
    {
    	// 최신버전일 경우
    }
    
    else
    {
    	// 구버전일 경우
    }


    위처럼 구현하면 버전 정수를 소수점으로 변환하여 비교할 수 있습니다.

  • Frudy
    6k
    2020-11-04 23:49:40 작성 2020-11-04 23:50:45 수정됨

    1.20.1 vs 1.2.11 케이스에서는 작동이 안되지않을까요?


    1.201

    1.211

    이니까 음.. 오른쪽이 더 크다고 나올거같아요.


    그런데 1년개발 하면서

    마이너버전이 20까지나 가는것도 못봤고,

    패치버전이 11까지 가는것도 못보긴했어요.


    그런데 작성글의 조건을 보니 RWB님 답변이 더 좋겠네요. 간단하고,

  • RWB
    408
    2020-11-04 23:53:54

    Frudy


    안그래도 짜다가 생각난건데, 저 방식이 메이져버전이 두자리 수인건 대응할 수 있는데, 마이너 버전이 두 자릿수일 경우 대응을 못 하는 문제가 있는 것 같습니다.


    예를 들어,

    9.4.0 -> 9.4

    10.2.5 -> 10.25

    위는 서로 구분이 가능한데


    4.5.1 -> 4.51

    4.11.1 -> 4.111

    요런식으로 되서 구분이 안 되는 것 같네요.


    이렇게 실수 +1 적립하고 갑니다 ㅠㅠ

  • Frudy
    6k
    2020-11-04 23:58:58

    근데 제 방법은 좀 복잡해요... ㅜㅜ

    그리고 빠른지도 모르겠어요.. ㅜㅜ


    저도 소수로 바꾼다는 신박한 아이디어 접하고 감니다

  • jslovers
    2k
    2020-11-05 00:43:39

    .을 delimiter로 split하고 둘 중 length가 더 큰 거로 loop 길이 기준 잡고 각각의 strign token을 Integer 변환 후 비교해서 같은 부분은 지나가고 차이 나는 부분을 찾으면 결과 반환하고 loop 빠져나옵니다.

  • 로그인을 하시면 답변 을 등록할 수 있습니다.