JAVA - 정렬(Comparable, Comparator)

정렬

만약 객체중에 이름과, 성적중 하나의 기준으로 정렬을하고자할때 사용한다.

Comparable, Comparator은 인터페이스이다 .

상속을받고 구현을 해야하는 인터페이스이다.

 

 

Comparator

패키지 : java.tuil

메소드 : compare()

정렬 : 그 외 다른 여러 기준으로 정렬하고자 할때 사용

사용법

정렬이 필요한 클래스를 생성하고 Comparator를 상속받아 compare() 를 오버라이딩하여 기존의 정렬을 재정의한다.

여러 개의 정렬 가능하다.

 

Collection 의 sort() 이용하여 정렬을 이용한다.

Collections.sort(list<T> List, Comparator<T> c) 

풀어보자면

Collections.sort(List 자료형, 정렬 기준)

 

Student.class

package model.vo;

public class Student {
	private String name;	// 이름
	private int ave;		// 평균점수
	
	public Student() {}

	public Student(String name, int ave) {
		this.name = name;
		this.ave = ave;
	}

	public String getName() {
		return name;
	}

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

	public int getAve() {
		return ave;
	}

	public void setAve(int ave) {
		this.ave = ave;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", ave=" + ave + "]";
	}
	
	
	
	
	
}

 

 

 

AscName.class : 이름 오름차순 

package comparator;

import java.util.Comparator;

import model.vo.Student;

public class AscName implements Comparator<Student>{
	
	// 이름 오름차순 정렬
	// 1. implements Comparator<자료형타입> 인터페이스 상속
	// 2. compare 구현
	// 문자열 정렬을  재정의할떄는 String 클래스의 compareTo 메소드 이용한다
	// 오름차순 정의 o1.compareTo(o2); 
	
	@Override
	public int compare(Student o1, Student o2) { //만약 Comparator 인터페이스 상속을 제네릭형식으로 작성안하면 Object 나옴 그래서 형변환 해줘야함 귀찮음
		return o1.getName().compareTo(o2.getName());
	}
	
	
}

 

DescName.class : 이름 내림차순 

package comparator;

import java.util.Comparator;

import model.vo.Student;

public class DescName implements Comparator<Student>{
	
	// 이름 내림차순 정렬
	// 1. implements Comparator<자료형타입> 인터페이스 상속
	// 2. compare 구현
	// 문자열 정렬을  재정의할떄는 String 클래스의 compareTo 메소드 이용한다
	// 내림차순은 오름차순 의반대로 정의
	// 내림차순 정의 o2.compareTo(o1);
	
	@Override
	public int compare(Student o1, Student o2) {
		return o2.getName().compareTo(o1.getName());
	}
}

 

AscAve.class : 평균 오름차순 

package comparator;

import java.util.Comparator;

import model.vo.Student;

public class AscAve implements Comparator<Student>{
	// 평균 오름차순 정렬
	// 방법 생략함 .
	// 기본자료형은 compareTo 이용안한다.
	// 기본자료형 오름차순 정의 : o1.getAve() - o2.getAve();
	@Override
	public int compare(Student o1, Student o2) {
		return o1.getAve() - o2.getAve();
	}
	
}

 

 

DescAve.class : 평균 내림차순

package comparator;

import java.util.Comparator;

import model.vo.Student;

public class DescAve implements Comparator<Student>{
	// 평균 내림차순 정렬
	// 방법 생략함 .
	// 기본자료형은 compareTo 이용안한다.
	// 기본자료형 내림차순 정의 : o2.getAve() - o1.getAve();
	@Override
	public int compare(Student o1, Student o2) {
		return o2.getAve() - o1.getAve();
	}
	
}

 

comTest.class : 메소드 실행 클래스

package controller;

import java.util.ArrayList;
import java.util.Collections;

import comparator.AscAve;
import comparator.AscName;
import comparator.DescAve;
import comparator.DescName;
import model.vo.Student;

public class comTest {

	public void test() {
		ArrayList<Student> std = new ArrayList<>(); //Student 타입만받을수있는 ArrayList생성
		
		// std 리스트에 3가지의 학생정보 입력
		std.add(new Student("김철수", 80));
		std.add(new Student("이철수", 90));
		std.add(new Student("나철수", 85));
		
		System.out.println("===== 정렬 안한상태로 출력 =====");
		// 그러면 add한 순서대로 입력됨
		for(Student s : std) {
			System.out.println(s);
		}
		System.out.println();
		
		// 새로운 클래스만들고 Comparator 상속받아 구현후 정렬
		// Collections.sort() 이용하여 정렬 
		System.out.println("===== 이름 오름차순 정렬 =====");
		Collections.sort(std, new AscName());
		for(Student s : std) {
			System.out.println(s);
		}
		System.out.println();
		
		System.out.println("===== 이름 내림차순 정렬 =====");
		Collections.sort(std, new DescName());
		for(Student s : std) {
			System.out.println(s);
		}
		System.out.println();
		
		System.out.println("===== 평균 오름차순 정렬 =====");
		Collections.sort(std, new AscAve());
		for(Student s : std) {
			System.out.println(s);
		}
		System.out.println();
		
		System.out.println("===== 평균 내림차순 정렬 =====");
		Collections.sort(std, new DescAve());
		for(Student s : std) {
			System.out.println(s);
		}
		System.out.println();
		
		
	}
	
}

 

run.class : 실행 클래스

package run;

import controller.comTest;

public class Run {

	public static void main(String[] args) {
		comTest c = new comTest();
		c.test();

	}

}

 

 

출력 

 

Comparable

패키지 : java.lang

메소드 : compareTo()

정렬 : 기존의 정렬기준을 구현하는데 사용

사용법

정렬하고자 하는 객체에 Comparable를 상속받아 CompareTo() 메소드를 오버라이딩해 기존의 정렬 기준 재정의 

딱 한개의 정렬만 사용가능

 

Student.class

package model.vo;

// 한가지의 정렬만 사용할것이기 때문에 implements Comparable 인터페이스 상속
public class Student implements Comparable<Student>{
	private String name;	// 이름
	private int ave;		// 평균점수
	
	public Student() {}

	public Student(String name, int ave) {
		this.name = name;
		this.ave = ave;
	}

	public String getName() {
		return name;
	}

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

	public int getAve() {
		return ave;
	}

	public void setAve(int ave) {
		this.ave = ave;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", ave=" + ave + "]";
	}

	// 아래의 정렬기준 메소드 활용
	@Override
	public int compareTo(Student o) {
		// 사용법은 Comparator 랑똑같다 
		// 매개 변수가 하나인 이유는 자신과 매개변수로 받는 자료형과 타입 확인하기 방법이다.
		
		// 이름 오름차순 정렬
//		 return name.compareTo(o.getName());
		
		// 이름 내림차순 정렬
//		 return o.getName().compareTo(name);
		
		// 성적 오름차순 정렬
//		 return ave - o.getAve();
		
		// 성적 내림차순 정렬
		 return o.getAve() - ave;
		
	}
	
	
	
	
	
}

 

comTest.class : 메소드 실행 클래스

public void test2() {
		ArrayList<Student> std = new ArrayList<>(); //Student 타입만받을수있는 ArrayList생성
		
		// std 리스트에 3가지의 학생정보 입력
		std.add(new Student("김철수", 80));
		std.add(new Student("이철수", 90));
		std.add(new Student("나철수", 85));
		
		// 1. Student의 클래스에 정렬을 사용해야하기때문에 Student 클래스에 Comparable 인터페이스 상속
//		System.out.println("==== 정렬 하지않았을때 =====");
//		for(Student s : std) {
//			System.out.println(s);
//		}
		
//		System.out.println("==== 이름 오름차순 정렬 =====");
//		Collections.sort(std);
//		for(Student s : std) {
//			System.out.println(s);
//		}
		
//		System.out.println("==== 이름 내림차순 정렬 =====");
//		Collections.sort(std);
//		for(Student s : std) {
//			System.out.println(s);
//		}
		
//		System.out.println("==== 성적 오름차순 정렬 =====");
//		Collections.sort(std);
//		for(Student s : std) {
//			System.out.println(s);
//		}
		
		System.out.println("==== 성적 내림차순 정렬 =====");
		Collections.sort(std);
		for(Student s : std) {
			System.out.println(s);
		}
		
		
	}

 

 

 

 

출력

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유