Java

[Java] Sort

Sungwoo Koo 2022. 7. 27. 12:20

정렬

순서를 가지는 Collection들만 정렬 가능 
- List 계열
- Set에서는 SortedSet의 자식 객체
- Map에서는 SortedMap의 자식 객체(key 기준)

 

Coleections의 sort()를 이용한 정렬
List<String> names = Arrays.asList("Hi", "Java", "World", "Welcome");
Collections.sort(names);
System.out.println(names);


[Hi, Java, Welcome, World]

 

Comparable 인터페이스 implements / String 클래스의 compareTo 메서드를 override하여 사용하는 정렬
public class SmartPhone implements Comparable<SmartPhone>{ 

	// Comparable<T>의 타입에는 비교하려는 객체의 타입을 넣어 주어야 한다.
	private String number;

	public SmartPhone(String number) {
		this.number = number;
	}

	@Override
	public int compareTo(SmartPhone o) {
		
		// String 클래스의 compareTo 메서드를 재사용
		// 폰 번호 기준으로 오름차순 정렬이 된다.
		return this.number.compareTo(o.number);
	}
}

 

Comparator 인터페이스 implements / compare 메서드를 override하여 사용하는 정렬
// 익명 클래스(new Comparator<String>(){}); 사용
Collections.sort(names, new Comparator<String>() { 
	@Override
    public int compare(String o1, String o2) {
    	return Integer.compare(o1.length(), o2.length());
	}
});

 

익명 클래스 (anonymous inner class)
comparator은 인터페이스인데 new Comparator로 사용
Comparator<String>을 implements 받는 클래스를 생성 하지 않고,
1회성으로 기능을 바로 구현하여 사용할 수 있음

 

1회성이 아닌 여러번 사용해야해서 익명 클래스를 사용하지 않는다면
// String 객체 끼리 비교 : 글자 길이 기준으로 오름차순 정렬
public class StringLengthComparator implements Comparator<String>{

	@Override
	public int compare(String o1, String o2) {
		int len1 = o1.length();
		int len2 = o2.length();
		return Integer.compare(len1, len2);
	}
	
}
	public void stringLengthSort() {
		Collections.sort(names, new StringLengthComparator());
		System.out.println(names);
	}