정렬
만약 객체중에 이름과, 성적중 하나의 기준으로 정렬을하고자할때 사용한다.
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);
}
}
출력
'프로그래밍 > JAVA' 카테고리의 다른 글
JAVA - Oracle JDBC 다운, 적용 (0) | 2021.07.12 |
---|---|
JAVA - GUI(Graphic User Interface) (0) | 2021.06.14 |
JAVA - 컬렉션 프레임워크 (0) | 2021.06.07 |
JAVA - I.O(입출력) > 보조 스트림 (0) | 2021.06.04 |
JAVA - I.O(입출력) > 기반 스트림 (2) | 2021.06.03 |