Java/Basic

[Java-Basic] Comparator과 Comparable을 사용한 배열 정렬

Jeong Jeon
반응형

1. Interface Comparable

정의 : 기본적으로 정렬하는 기준이 되는 메소드를 정의하는 인터페이스

사용 : 쉽게 말해 Arrays.sort() 메서드는 아래와 같은 정렬 기준인데, 기준을 반대로 역정렬 하고싶을때 등등 사용

         => 기본정렬기준 자체를 변경하여 사용하고 싶을때

    ex). Integer,Double등 => 오름차순 정렬

         String => 사전순 정렬

 

compareTo()메소드를 사용해서 정렬하는데,

현재객체 < 파라미터 => return 음수

현재객체 == 파라미터 => return 0

현재객체 > 파라미터 => return 양수

 

양수인 경우에는 두 객체의 자리가 바뀌고, 음수 또는 0이면 객체의 자리가 그대로 유지된다. 

 

사용방법 : 기존 sort()메소드를 재정의 했기때문에 그대로 사용한다.

- 1). Arrays.sort(array);

- 2). Collections.sort(list);

 

 

예시 : x,y좌표 List를 받아 , x좌표가 증가하는 순으로 정렬하는데, x좌표값이 같다면 y가 증가하는 순으로 정렬하시오.

 

public class MyComparable implements Comparable<MyComparable>{

	int x,y;

	@Override
	public int compareTo(MyComparable p) {
		// Comparable의 메소드를 오버라이드 한다.
		if(this.x > p.x) {
			return 1;
		}else if(this.x == p.x) {
			if(this.y>p.y) {
				return 1;
			}
		}
		return -1;
	}

	@Override
	public String toString() {
		return "Point [x=" + x + ", y=" + y + "]";
	}

	public MyComparable(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public static void main(String[] args) {
		List<MyComparable> pointList = new ArrayList<>();
		pointList.add(new MyComparable(1,10));
		pointList.add(new MyComparable(6,5));
		pointList.add(new MyComparable(6,3));
		pointList.add(new MyComparable(2,6));
		pointList.add(new MyComparable(1,4));

		Collections.sort(pointList);
		pointList.forEach((MyComparable p)->System.out.println(p.toString()));
	}

 

결과 :

MyComparable [x=1, y=4]
MyComparable [x=1, y=10]
MyComparable [x=2, y=6]
MyComparable [x=6, y=3]
MyComparable [x=6, y=5]

 

 

2. Interface Comparator

정의 : 정렬가능한 클래스(Comparable Interface를 구현한)의 정렬 기준과 다르게 변경하여 사용하고 싶을때

사용 : 오름차순 정렬을 내림차순으로 바꿔서 사용하고싶을때 등 => 기본 정렬기준과 다르게 정렬하고싶을때 => 만들

        어서 사용하고 싶을때

 

compare()메소드를 사용해서 정렬하는데,

첫 파라미터 < 둘째 파라미터 => return 음수

첫 파라미터 == 둘째 파라미터 => return 0

첫 파라미터 > 둘째 파라미터 => return 양수

양수인 경우에는 두 객체의 자리가 바뀌고, 음수 또는 0이면 객체의 자리가 그대로 유지된다. 

   ==>Integer.compare(x, y)(오름차순 정렬)와 동일한 개념

         =>return (x<y)? -1: ((x==y)? 0:1);

         => 내림차순은 x와 y를 거꾸로 넣으면 된다.

 

사용방법 : sort()메소드를 사용할떄 내가 재정의한 Comparator를 같이 입력해준다.

-1). Arrays.sort(array,myComparator);

-2). Collections.sort(list,,myComparator);

 

 

예시 : x,y좌표 List를 받아 x좌표가 증가하는 순으로 정렬하는데, x좌표값이 같다면 y가 감소하는 순으로 정렬하시오.

public class MyComparator implements Comparator<MyComparable>{
	int x, y;

	@Override
	public int compare(MyComparable o1, MyComparable o2) {
		if(o1.x > o2.x) {
			return 1;
		}else if(o1.x == o2.x) { //x가 같다면 y가 큰 순서대로 정렬
			if(o1.y < o2.y) {
				return 1;
			}
		}
		return -1;
	}

	public static void main(String[] args) {
		List<MyComparable> comList = new ArrayList<>();
		comList.add(new MyComparable(1,2));
		comList.add(new MyComparable(2,6));
		comList.add(new MyComparable(1,1));
		comList.add(new MyComparable(5,3));
		MyComparator myComparator = new MyComparator();
		Collections.sort(comList,myComparator);
		comList.forEach((MyComparable c) -> System.out.println(c.toString()));
	}
}

 

결과 :

MyComparable [x=1, y=2]
MyComparable [x=1, y=1]
MyComparable [x=2, y=6]
MyComparable [x=5, y=3]

 

Comparator는 아주 편리하게 Coparator 인스턴스 생성과 동시에 오버라이드해서 사용하는것이 가능하기때문에, 특정 규칙을 사용하는 부분이라면 바로 사용하는게 낫다.

public static void main(String[] args) {
		List<MyComparable> comList = new ArrayList<>();
		comList.add(new MyComparable(1,2));
		comList.add(new MyComparable(2,6));
		comList.add(new MyComparable(1,1));
		comList.add(new MyComparable(5,3));

		Collections.sort(comList,new Comparator<MyComparable>() {
			@Override
			public int compare(MyComparable o1, MyComparable o2) {
				if(o1.x>o2.x) {
					return 1;
				}else if(o1.x== o2.x) {
					if(o1.y > o2.y) {
						return 1;
					}
				}
				return -1;
			}

		});
		comList.forEach((MyComparable c) -> System.out.println(c.toString()));
	}

 

예시2 : Array를 사전 역순으로 정렬하시오

public class MyComparatorArray implements Comparator<String>{

	@Override
	public int compare(String o1, String o2) {
		char[] a1 = o1.toCharArray();
		char[] a2 = o2.toCharArray();

		//한글자이기 때문에 0으로 하드입력.
		if(a1[0]>a2[0]) {
			return 1;
		}else if(a1[0]==a2[0] ){
			return 0;
		}
		return -1;
	}

	public static void main(String[] args) {
		String[] arr = new String[] {"A","C","B","D","A"};

		Arrays.sort(arr,new MyComparatorArray());
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
}

 

우선순위 Queue의 2번째 인자로 comparator를 사용해서 우선순위를 할당할수 있다고 하는데, 알아두면 좋겠다!

 

오늘도 화이팅!

반응형