[프로그래밍언어][Java(자바)] (Interface) Comparable<T>, Comparator<T> - 비교, 정렬 기준

728x90

 

Interface Comparable<T>

 

Modifier and Type Abstract Method Description
int compareTo(T o)   현재 개체와 전달받은 개체를 비교하여 순서 지정
자기 자신이 더 크면 양수 반환,
   인수가 더 크면 음수 반환
*  콜백 메서드 ( Callback Method )
 ( 프로그래머가 작성하지만 시스템이나 자바 컬렉션 프레임워크가 호출하는 메서드 )

( https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html )

 

예시

더보기
import java.util.*;

public class SortEx_Comparable {

	static class Node implements Comparable<Node> {
		int val;
		public Node(int val) {
			this.val = val;
		}
		@Override
		public int compareTo(Node o) {
			return this.val - o.val;		// 오름차순
			//return o.val - this.val;	// 내림차순
		}
		@Override
		public String toString() {
			return "Node [val=" + val + "]";
		}
	}

	public static void main(String[] args) {

		List<Node> ls = new ArrayList<>();
		ls.add(new Node(5));
		ls.add(new Node(8));
		ls.add(new Node(2));
		Collections.sort(ls);
		System.out.println(ls);

		Set<Node> ts = new TreeSet<>();
		ts.add(new Node(5));
		ts.add(new Node(8));
		ts.add(new Node(2));
		System.out.println(ts);
	}
}

 

 


 

Interface Comparator<T>

 

Modifier and Type Abstract Method Description
int compare(T o1, T o2)   전달받은 두 개체를 비교
*  첫 번째 인수가 더 크면 양수 반환,
   두 번째 인수가 더 크면 음수 반환
*  String 클래스는 Comparable 인터페이스를 이미 구현했고 final로 선언되었다. 따라서 compareTo() 메서드를 사용할 수 없는데, 이 때 사용

( https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html )

 

예시

더보기
import java.util.*;

public class SortEx_Comparator {

	static class Node {
		int val;
		public Node(int val) {
			this.val = val;
		}
		@Override
		public String toString() {
			return "Node [val=" + val + "]";
		}
	}

	public static void main(String[] args) {
    
		// [way 1]
		Comparator<Node> comparator = new Comparator<Node>() {
			@Override
			public int compare(Node o1, Node o2) {
				return o1.val - o2.val;		// 오름차순
				//return o2.val - o1.val;		// 내림차순
			}
		};
		// [way 2]
		comparator = (o1, o2) -> { 
			return o1.val - o2.val;			// 오름차순
			//return o2.val - o1.val;			// 내림차순
		};
		// [way 3]
		comparator = (o1, o2) -> (o1.val - o2.val);		// 오름차순
								// (o2.val - o1.val));	// 내림차순
        
		List<Node> ls = new ArrayList<>();
		ls.add(new Node(5));
		ls.add(new Node(8));
		ls.add(new Node(2));
		Collections.sort(ls, comparator);
		System.out.println(ls);

		Set<Node> ts = new TreeSet<>(comparator);
		ts.add(new Node(5));
		ts.add(new Node(8));
		ts.add(new Node(2));
		System.out.println(ts);
	}
}

 

 

반응형