해결된 질문
21.02.26 23:41 작성
·
351
1
이강의 듣기 전에
https://st-lab.tistory.com/112
여기서 compareTo를 먼저 접했는데
public int compare(String s1, String s2) {
// 단어 길이가 같을 경우
if(s1.length() == s2.length()} {
return s1.compareTo(s2); // 사전 순 정렬
}
// 그 외의 경우
else {
return s1.length() - s2.length();
}
}
});
이 부분과 이 강의에서 하는게 같은 걸까요? 이 코드에선 s1.compareTo(s2); 가 바로 오름차순 정렬? 이고 반대(return s1.length() - s2.length();) 가 내림차순 정렬같은데 Comparator 개념 잡기가 좀 힘드네요.. 알려주시면 감사하겠습니다.
답변 2
1
2021. 02. 27. 10:59
자세한 예제랑 답변 정말 감사합니다. 자바로 코테를 준비한지 얼마 안 됐지만 저 comparator 부분을 볼 때마다 계속 어렵고 헷갈렸거든요. 유치하다 하셨는데 오히려 전 이해가 더 잘 되서 좋은 거 같아요. 다른 강의도 얼른 나왔으면 좋겠네요. 답변 감사합니다.
1
2021. 02. 27. 08:15
안녕하세요~~
CompareTo() 함수는 아주 중요합니다. 코테 뿐만 아니라 자바스프링 같은경우에도 많이 쓰여집니다.
코테를 안보고 과제를 주는 회사도 있습니다
과제는 자바스프링이 대한민국에서 99% 합니다.
제강의 sort 개념설명에 제일 처음에 나옵니다. 그리고 사람들이 이부분을 제대로 이해하지 않은 상태에서
Sort(), Comparator(), PriorityQueue() 를 쓰고 있습니다. 이 함수들의 내부에 CompareTo() 함수랑 같은 기능을 하는 compare가 있습니다.
1. 질문주신 내용 하기전에 기본개념 다시 설명 드리면,
제 예제입니다.
Integer a = 1, b=3;
System.out.println( a.compareTo(b) ); // -1
System.out.println( a.compareTo(1) ); // 0
System.out.println( a.compareTo(0) ); // 1
a, b를 a.compareTo(b) 이렇게 표현하고 ,이때 오름 차순으로 a=1, b=3 이면
-1이 리턴됩니다. 이해 돼셨나요?
a, b를 a.compareTo(b) 이렇게 표현하고 ,이때 내림 차순 으로 a=3, b=1 이면
1이 리턴됩니다. 이해 돼셨나요?
강의중에는 유치해서 표현 안했는데 저는 이렇게 외웁니다. "오름마" 걸음마 응용버젼 ㅋ
a.compareTo(b) 이렇게 표현이 기본상태에서, 오름차순 값이 있는데 ,마이너스 1 리턴
왜 마이너스 1이냐? 그건 만든 사람이 그렇게 정한겁니다. 1-3 하면 =-2가 나오니까 -1로 리턴하자 하고 만든겁니다.
다음부터는 강의에 넣어야 겠네요
자 그럼 질문 주신 문제를 풀어 보겠습니다.
public int compare(String s1, String s2) {
// 단어 길이가 같을 경우
if (s1.length() == s2.length()) {
return s1.compareTo(s2);
}
// 그 외의 경우
else {
return s1.length() - s2.length();
}
}
=> Arrays.sort compare(s1, s2) 에서 -1을리턴하면 오름차순, 0을 리턴하면 동일값, 1을 리턴하면 내림차순인데 이문제에서는 문자의 길이를 가지고 리턴합니다.이해하셨나요?
이렇게하면 오름차순으로 나옵니다.
Arrays.sort(arr, new Comparator<String>() {
public int compare(String s1, String s2) {
// 단어 길이가 같을 경우
if (s1.length() == s2.length()) {
return s1.compareTo(s2);
}
// 그 외의 경우
else {
return s1.length() - s2.length();
}
}
});
내림차순은
Arrays.sort(arr, new Comparator<String>() {
public int compare(String s1, String s2) {
// 단어 길이가 같을 경우
if (s1.length() == s2.length()) {
return s1.compareTo(s2);
}
// 그 외의 경우
else {
return s2.length() - s1.length(); //순서 바꿔치기 하면 내림차순
}
}
});
더 충격적인건 오름차순 이렇게 해도 됩니다.( 저위에 긴문장을 한라인으로 대체) 람다식입니다.
Arrays.sort(arr, (a,b) -> a.length() - b.length());
내림차순
Arrays.sort(arr, (a,b) -> b.length() - a.length());
주신 예제 풀소스입니다
package Sort;
import java.util.Arrays;
import java.util.Comparator;
public class CompareTest {
public static void main(String[] args) {
String[] arr = { "13", "i", "more", "im" };
Arrays.sort(arr, new Comparator<String>() {
public int compare(String s1, String s2) {
// 단어 길이가 같을 경우
if (s1.length() == s2.length()) {
return s1.compareTo(s2);
}
// 그 외의 경우
else {
return s1.length() - s2.length();
}
}
});
// Arrays.sort(arr, (a,b) -> b.length() - a.length());
System.out.println(arr[0]);
for (int i = 1; i < arr.length; i++) {
// 중복되지 않는 단어만 출력
if (!arr[i].equals(arr[i - 1])) {
System.out.println(arr[i]);
}
}
}
}
쓰다 보니까 너무 길어져서 강의를 만들어야겠네요. 솔직히 이 내용이 전부 녹아 있는게 제 강의 인데
개념설명문제에 만들어야겠습니다