개발자 미니민의 개발스터디

[JAVA] 자바 - Comparable 클래스와 Collections sort(정렬) / Comparator

by mini_min

[JAVA]
자바 - Comparable 구현 클래스의 Collections sort(정렬)

✔️ collections sort 하고 싶은데 list에 클래스 값이 저장되어있다...?

제목 그대로. collections sort 하고 싶은데, list에 add 로 값이 아닌 클래스가 저장되어 있을 때, collections sort 할 수 있을까? 답은 안된다.collections sort 는 Comparable 만 적용 가능하다. 아래 User5 는 Comparable 클래스가 아니다. 

List<User5> list = new ArrayList<>();
		
		
	//class User5 가 Comparable 클래스가 아님..
    list.add(new User5("도도도", "010", 20));
	list.add(new User5("후후후", "011", 21));
	list.add(new User5("가가가", "012", 22));
	list.add(new User5("가나", "013", 21));
	list.add(new User5("도미솔", "014", 23));
		
	System.out.println("정렬 전..");
	disp(list);

 

class User5 {

private String name;
	private String tel;
	private int age;
    
    
    public User5() {
		
	}
	
	public User5(String name, String tel, int age) {
		this.name = name;
		this.tel = tel;
		this.age = age;
	}
	
    
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}
💡 이럴 때 해결방법!
바로, User5 클래스가 Comparable 클래스를 상속받도록 조정.
+  Comparable 인터페이스의 compareTo 메소드도 재정의 가능! 재정의시 정렬의 기준을 설정할 수 있다.

 

 

class User5 implements Comparable<User5> {

//아래 생략//

//Comparable 인터페이스의 compareTo 메소드다! : 정렬의 기준 설정
	@Override
	public int compareTo(User5 o) {
		//이름 오름차순 정렬
		//return name.compareTo(o.getName()); //이름 오름차순 정렬
		//return -name.compareTo(o.getName()); //이름 내림차순 정렬
		
		//return age - o.getAge(); //나이 오름차순
		return - (age - o.getAge()); //나이 내림차순
		
	}
💡 위에 코드는 나이 오름차순으로 정렬했는데, 나이의 자료형은 int 이다.
자료형이 int 일 때는 '-' 부호 써서 정의하니까 꼭 기억하기!

만약 자료형이 String 이면, compareTo 를 붙여서 오름차순/내림차순을 정렬한다.

 

 

 

✔️ Comparator 객체 만들어서 List 객체 정렬하기!!

위에 처럼 User5 클래스가 정렬 가능한 클래스를 상속받게 해서 정렬하는 방법도 있고, 다른 방법으로는 Comparator  인터페이스를 만들어서 정렬하는 방법도 있다!

List<User6> list = new ArrayList<>();
	list.add(new User6("도도도", "010", 25));
	list.add(new User6("가나다", "011", 22));
	list.add(new User6("가마", "012", 20));
	list.add(new User6("호호호", "013", 23));
	list.add(new User6("나노노", "014", 22));
	
	System.out.println("정렬 전 : ");
	disp(list);
    
    Comparator<User6> comp = new Comparator<User6>() {
 	@Override
	public int compare(User6 o1, User6 o2) {
		return o1.getName().compareTo(o2.getName());
		}	
	};
💡 User6 = 일반 클래스
Comparator<User6> comp = new Comparator<User6>() 이렇게 Comparator 인터페이스를 만들어서 재정의하고 사용하면 편리하다! 굳이 상속시켜줄 필요도 없고.... override 에 정렬 기준 설정하면 끝

정렬할 때는, 두번째 인자에 override 했던 정렬 기준 넣기
Collections.sort(list, comp);
Collections.sort(list, comp); //두번째 인자가 정렬의 기준이 된다.
System.out.println("정렬 후 : ");
disp(list);

 

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기