본문 바로가기
Java/정리

[Java] 문자열 compareTo()_문자열비교메소드

by 콧등치기국수 2021. 5. 17.

객체배열 mvc과제 중 compareTo()를 활용해서 코드를 썼다. Controller에 만들어야 할 메소드들이 많고, 반환형이 객체배열이고 하다보니 객체를 생성해서 대입하거나 또는 객체배열 복사 등등에서 헷갈리는 것들이 있어서 오류도 많이 나고 안되고 해서 힘들었지만 그래도 어제 다 마무리해서 속이 시원하다.

 

mvc과제를 하면서 이것저것 오류들을 만들면서 배운것들을 기록해둬서 다음에는 같은 문제를 발생시키지 않아야지

 

 

1. 문자열에서 compareTo()메소드란? 

compareTo()는 문자열을 비교하여 (양수,0,음수)의 값을 반환해주는 메소드이다.

int 에서 compareTo()는 +1,0,-1을 반환하지만, 문자열에서는 각 문자열마다 반환되는 숫자가 다르다.

즉, 유니코드문자표에서 얼마나 차이가 나는지에 따라 반환되는 숫자가 결정된다.

 

일단 아래에서 양수,음수,0이 어떻게 결정되는지부터 확인해보자.

 

System.out.println( s1.compareTo(s2) );

 

s1 == s2           :   0                

s1 > s2             :   +(양수)         

s2 > s1             :   -(음수)   

 

1) A, Z비교하기

String u1 = "Apple";
String u2 = "Zoo";
		
System.out.println(u1.compareTo(u2));    //-25
System.out.println(u2.compareTo(u1));    //25

 

 

유니코드표에서 A는 65 , Z는 90이었고, 이 둘의 차이는 25이다.

따라서 compareTo()로 비교할 경우 이 둘의 차이만큼 숫자가 반환된다.

 

 

2) a, A 비교하기  &  Aa, Ab비교하기

System.out.println("====================");
		
String u3 = "apple";
String u4 = "Apple";
String u5 = "Aa";
String u6 = "Ab";
System.out.println(u3.compareTo(u4));    //32
System.out.println(u3.compareTo(u5));    //32
System.out.println(u5.compareTo(u6));    //-1

유니코드표에서 A는 65 , Z는 90, a는 97, z는 122이다.

따라서 apple(97)을 Apple(65)을 비교하면 양수가 나오고, 차이는 32이므로 (+)32이가 출력된다.

 

Aa 를 Ab를 비교하면 -1이 나오는데,

첫번째 자리인 A가 같으므로 A뒤의 a,b를 비교하여 나온 결과이다.

 

 

 

2. 활용

public Member[] sortIdAsc() {
			// 기존의 회원 객체 배열(mem)을 변경하지 않고 단지 정렬된 결과만을 보여주기 위해
			// 기존의 배열 복사해서 사용 (clone(), System.arraycopy() 둘 중 하나 사용해서 복사) 
			Member[] copy = new Member[memberCount];
			System.arraycopy(mem, 0, copy, 0, memberCount);
		
			// copy 배열을 아이디 별 오름차순 정렬 진행 
			// --> HINT : String 클래스의 compareTo() 메소드 활용
			// copy 주소 값 리턴
			for(int i=0; i<copy.length; i++) {
				for(int k=0; k<i; k++) {
					String bef= copy[k].getUserId();
					String aft = copy[i].getUserId();
					if(aft.compareTo(bef)<0) {
						copy[i].setUserId(bef);
						copy[k].setUserId(aft);	
					}
				}
			}
			return copy;
	}

1) 오름차순 정렬

 

for(int k=0; k<i; k++) {
      String bef= copy[k].getUserId();
      String aft = copy[i].getUserId();
      if(aft.compareTo(bef)<0) {
            copy[i].setUserId(bef);
            copy[k].setUserId(aft);
      }
}

 

2) 오름차순 정렬은 뒤로 갈수록 커져야 하므로,

의 배열에 있는 의 배열에 있는 보다 큰 경우 두 값을 바꿔줘야 한다.

 

앞의 값 :  String bef= copy[k].getUserId();

뒤의 값 :  String aft = copy[i].getUserId();

 

 

3) 따라서 아래와 같이 if문의 조건으로 적어줘서 값을 바꾸어 줘야한다. 

- aft.compareTo(bef)<0  ==> 뒤의 값이 앞의 값보다 작은 경우

- bef.compareTo(aft)>0  ==> 앞의 값이 앞의 값보다 큰 경우

'Java > 정리' 카테고리의 다른 글

[Java] 예외처리_BufferedReader사용  (0) 2021.05.25
[Java] 상속(Inheritance)  (0) 2021.05.19
[Java] 객체  (0) 2021.05.14
[Java] 2차원 배열 문제  (0) 2021.05.12
[Java] 배열복사  (0) 2021.05.11