
Arrays.sort() 는 단순 배열을 오름차순으로 정렬해주는 것 뿐만 아니라 사용자에 의해 구현될 수도 있음
여기서 Comparator<?superT>c 에 대한 이해가 필요한데, Arrays.sort() 메소드 안에는 두 객체(원소)를 비교하여 위치를 바꿀지 말지 판단하면서 정렬을 한다.
기본적으로 Comparator 는 객체를 비교할 수 있도록 해주는 인터페이스이다. 보통,int , char , double 등의 자바에서 기본적으로 제공하는 자료형들은 비교가 가능하지만
사용자가 사용자 클래스를 만들어 비교한다거나, 특정 규칙에 의해 비교를 하고 싶은 경우에는 Comparator를 구현해야 한다.
"<? super T>" 는 상속관계에 있는 타입만 자료형으로 받겠다는 의미이다. T 타입이 자식클래스가 되고, T의 상속관계에 있는 타입까지만 허용하겠다는 의미임.
쉽게 T = Type 을 의미하며, 객체, 자료형 등의 다양한 타입 중 하나를 설정할 수 있다는 것.
List<? super Number> myList = new ArrayList<>();
myList.add(10); // Integer는 Number의 하위 타입이므로 추가 가능
myList.add(3.14); // Double은 Number의 하위 타입이므로 추가 가능
Number num = (Number) myList.get(0); // 가져온 요소의 타입은 Number로 캐스팅 가능
이런식으로 <? super T> 는 특정 타입 또는 그 타입의 상위 타입을 받을 수 있는 유연성을 제공할 수 있고, 메서드나 클래스에서 다양한 타입의 객체를 처리할 수 있도록 도와줌.
문제에서 우리가 정렬할 배열의 타입은 String 임. 즉 T는 String이 됨
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//단어를 길이순으로 정렬한 뒤, 길이가 같을 경우 사전순으로 정렬해야함.
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
String wd [] = new String[N];
for (int i = 0; i<wd.length; i++){
wd[i] = sc.next();
}
Arrays.sort(wd, 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();
}
}
});
System.out.println(wd[0]);
for(int i = 1; i<N; i++){
if(!wd[i].equals(wd[i -1])){
System.out.println(wd[i]);
}
}
}
}
양의 값을 가질 경우는 Arrays.sort()에 의해서 위치를 바꾸고 0이나 음의 정수인 경우 두 객체의 위치는 바뀌지 않음
Ex) {3,1,4} 라는 배열이 있다고 하자
3 - 1 = 양의 값 -> 위치 바꿈
3 - 4 = 음의 값 -> 위치 바꾸지 않음
.... -> {1,3,4} 오름차순으로 정렬됨.
Arrays.sort(wd, 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();
}
}
});
Arrays.sort 메서드를 사용하여 문자열 배열 wd 를 정렬하고 Comparator를 람다식으로 구현함. (길이가 같으면 사전순으로 정렬하고,길이가 다르면 길이순으로 정렬함.)
나머지는 중복을 제거하기 위해서 정렬된 배열의 첫 번째 원소를 출력한 후, if 조건문으로 현재 원소가 이전 원소와 같지 않을 경우에만 출력하도록 한다.