13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours
i
im
it
no
but
more
wait
wont
yours
cannot
hesitate
s
을 선언한다.s
에 입력한다.Arrays.sort()
를 통해 배열s
을 정렬한다.Arrays.sort()
는 Comparator
를 통해 객체를 비교하며 정렬할 수 있다.s
는 중복을 제외하고 값을 출력한다.public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] s = new String[n];
for(int i = 0; i < n; i++) {
s[i] = br.readLine();
}
Arrays.sort(s, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.length() == o2.length()){
return o1.compareTo(o2);
} else {
return o1.length() - o2.length();
}
}
});
StringBuilder sb = new StringBuilder();
sb.append(s[0]).append("\n");
for(int i = 1; i< n; i++) {
if(!s[i].equals(s[i-1])){
sb.append(s[i]).append("\n");
}
}
System.out.println(sb);
}
}
Arrays.sort(s, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.length() == o2.length()){
return o1.compareTo(o2);
} else {
return o1.length() - o2.length();
}
}
});
💡new Comparator<? super T>
는 Arrays.sort()
메서드 안에서 두 개의 값을 비교할 수 있도록 해주는 인터페이스이다.
선언과 함께 compare()
가 오버라이딩 되고, Comparator의 자료형이 어떤 타입인지 상관없이 compare()
메서드는 int
타입만 반환한다.
🤔왜
int
타입만 반환하지?
compare()
메서드는 3가지 리턴값에 의해 비교한 값들의 위치가 결정된다.
1. 양의 정수
2. 0
3. 음의 정수
💡o1.length() - o2.length()
를 보면 o1이 o2보다 길이가 길 경우, 양의 정수가 반환 된다. 그러면 o1이 o2보다 긴 문자열이라는 것이기 때문에 둘의 위치를 변경한다.
음의 정수나 위치를 변경하지 않는다.
🤔 그럼 0이 반환될 경우는?
음의 정수를 반환한 것처럼 위치 변경을 하지 않는다. 하지만 여기서는 사전순 정렬이 필요하므로 별도의 로직이 필요하다.
compareTo()
메서드는 문자열을 비교하기 위해 사용되지만, 사전 순서로 값을 비교할 수 있다.
o1.compareTo(o2)
에서 o1이 o2보다 사전순으로 앞서면 음수를 반환하고, 뒤에 있으면 양수를 반환해 정렬 순서를 변경한다.