객체배열 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 |