• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    해결됨

Comparator 질문입니다.

21.02.26 23:41 작성 조회수 263

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

Solioquies님의 프로필

Solioquies

질문자

2021.02.27

자세한 예제랑 답변 정말 감사합니다. 자바로 코테를 준비한지 얼마 안 됐지만 저 comparator 부분을 볼 때마다 계속 어렵고 헷갈렸거든요. 유치하다 하셨는데 오히려 전 이해가 더 잘 되서 좋은 거 같아요. 다른 강의도 얼른 나왔으면 좋겠네요. 답변 감사합니다.

1

안녕하세요~~

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]);

}

}

}

 

}

쓰다 보니까 너무 길어져서 강의를 만들어야겠네요. 솔직히 이 내용이 전부 녹아 있는게 제 강의 인데

개념설명문제에 만들어야겠습니다