[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);
'Java' 카테고리의 다른 글
[JAVA] 자바 - annotation / 빌트인 어노테이션, 메타 어노테이션 (0) | 2022.08.02 |
---|---|
[JAVA] 자바 - Comparator 으로 성적처리 프로그램 정렬!! (0) | 2022.08.02 |
[JAVA] 자바 - shuffle이용해서 조 편성하기 (0) | 2022.08.02 |
[JAVA] 자바 - 컬렉션 Collection 정렬하기(순차/이분/역순 검색) (0) | 2022.08.02 |
[JAVA] 자바 - 컬렉션 Collection 프레임워크 & shuffle (0) | 2022.08.02 |
블로그의 정보
개발자 미니민의 개발로그
mini_min