본문 바로가기

자바(JAVA)
[자바(Java)] Comparator와 Comparable

- 컬렉션을 정렬하는 데 필요한 메서드를 정의한 인터페이스

- 두 객체의 비교 결과를 반환하도록 작성해야 한다.(같으면 0, 비교하는 값보다 작으면 음수, 크면 양수를 반환)

- 오름차순: 왼쪽 값이 클 때 자리 바꿈.
- 내림차순: 오른쪽 값이 클 때 자리 바꿈.

- Comparator : 기본 정렬 기준 외에 다른 기준으로 정렬하고자 할 때 사용.
 compare(Object o1, Object o2); //o1, o2 두 객체를 비교

- Comparable : 기본 정렬기준을 구현하는 데 사용.
compareTo(Object o); // 주어진 객체를 자신과 비교

- import java.util.Arrays;
- import java.util.Comparator;


// Comparator<T>

- 정렬할 때 비교를 담당하는 compare 메서드를 구현해야 함.

1. 오름차순
    - o1 크면 양수 반환
    - o2 크면 음수 반환
    - 같으면 0 반환

    ~ public int compare(T o1, T o2) { 
           return o1 - o2;
       }
  
  
2. 내림차순
    - o1 크면 음수 반환
    - o2 크면 양수 반환
    - 같으면 0 반환   
  
    ~ public int compare(T o1, T o2) { 
           return o2 - o1;  > 내림차순
       }


- 오름차순

package com.test.obj.type;

import java.util.Arrays;
import java.util.Comparator;

public class Ex83_Sort {

	public static void main(String[] args) {

		m3();

	} //main

	private static void m3() {
		
		Integer[] nums = { 1, 5, 6, 4, 2, 3 };
		
		Comparator<Integer> my = new Comparator<Integer>() {
			
			@Override
			public int compare(Integer o1, Integer o2) {
				return o1-o2;
			}
			
		};
		
		Arrays.sort(nums, my);
		
		System.out.println(Arrays.toString(nums));
		
	}
}

- 내림차순

package com.test.obj.type;

import java.util.Arrays;
import java.util.Comparator;

public class Ex83_Sort {

	public static void main(String[] args) {

		m3();

	} //main

	private static void m3() {
		
		Integer[] nums = { 1, 5, 6, 4, 2, 3 };
		
		Comparator<Integer> my = new Comparator<Integer>() {
			
			@Override
			public int compare(Integer o1, Integer o2) {
				return o2-o1;
			}
			
		};
		
		Arrays.sort(nums, my);
		
		System.out.println(Arrays.toString(nums));
		
	}
}

- 문자열 비교

package com.test.obj.type;

import java.util.Arrays;
import java.util.Comparator;

public class Ex83_Sort {

	public static void main(String[] args) {

		m5();

	} //main

	private static void m5() {
		
		String[] names = { "홍길동", "아무개", "하하하", "가가가", "나나나", "김민", "남궁재민" };
		
		//가나다순 > 오름차순
		Arrays.sort(names);
		System.out.println("가나다 기준 오름차순 정렬 :" + Arrays.toString(names));
		
		Arrays.sort(names, new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				return o2.compareTo(o1);
			}
		});

		System.out.println("가나다 기준 내림차순 정렬 :" + Arrays.toString(names));
		
		Arrays.sort(names, new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				return o1.length() - o2.length();
			}
		});

		System.out.println("이름 길이 기준 오름차순 정렬 :" + Arrays.toString(names));
		
	}
    
}

- 컬렉션 정렬

package com.test.obj.type;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

public class Ex83_Sort {

	public static void main(String[] args) {

		m7();

	} //main

	private static void m7() {
		
		ArrayList<Integer> nums = new ArrayList<Integer>();
		
		nums.add(5);
		nums.add(4);
		nums.add(2);
		nums.add(1);
		nums.add(3);

		System.out.println("정렬 전 : " + nums);
		
		nums.sort(new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				return o1 - o2;
			}
		});
		
		System.out.println("정렬 후 : " + nums);		
	}
	
}

import java.util.Arrays;
import java.util.Comparator;

public class Ex11 {
	public static void main(String[] args) {
		String[] strArr = {"cat", "Dog", "lion", "tiger"};
		
		Arrays.sort(strArr); // String의 Comparable 구현에 의한 정렬
		System.out.println("strArr = " + Arrays.toString(strArr));
		
		Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); // 대소문자 구분 안 함.
		System.out.println("대소문자 구분하지 않은 strArr 정렬 = " + Arrays.toString(strArr));
		
		Arrays.sort(strArr, new Descending()); // 역순 정렬
		System.out.println("역순으로 strArr 정렬 = " + Arrays.toString(strArr));
	}
}

class Descending implements Comparator { //역순 정렬 구현
	public int compare(Object o1, Object o2) {
		if (o1 instanceof Comparable && o2 instanceof Comparable) {
			Comparable c1 = (Comparable)o1;
			Comparable c2 = (Comparable)o2;
			return c1.compareTo(c2) * -1 ;
            //return c2.compareTo(c2) 도 같은 결과 반환
		}
		return -1;
	}
}

- 람다식 이용 내림차순 정렬

package com.test.lambda;

import java.util.ArrayList;

public class Ex88_lambda {

	public static void main(String[] args) {

		ArrayList<Integer> list = new ArrayList<Integer>();
		
		for(int i = 0; i < 20; i++) {
			list.add((int)(Math.random() * 100) + 1);
		}
		
		System.out.println("정렬 전 : " + list);
		
		
//		list.sort(new Comparator<Integer>() {
//			@Override
//			public int compare(Integer o1, Integer o2) {
//				return o2 - o1;
//			}
//		});
		
		list.sort((o1, o2) -> o2 - o1);
		
		System.out.println("내림차순 정렬 후 : " + list);
		
	} //main
	
}

- 람다식 이용 다중 정렬
    ~ 1차 정렬: 나이 기준 내림차순 
    ~ 2차 정렬: 성별 기준 내림차순 
    ~ 3차 정렬: 지역 기준 오름차순 

package com.test.lambda;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;

public class Ex89_lambda {

	public static void main(String[] args) {

		m3();

	} //main

	private static void m3() {

		//다중 정렬
		ArrayList<User> list = new ArrayList<User>();

		try {
			BufferedReader reader = new BufferedReader(new FileReader("C:\\OneDrive\\class\\code\\java\\JavaTest\\dat\\user.txt"));

			String line = null;

			while((line = reader.readLine()) != null) {

				String[] temp = line.split(",");

				User user = new User(
						temp[0],
						temp[1],
						Integer.parseInt(temp[2]),
						temp[3],
						temp[4],
						temp[5]);

				list.add(user);

			}

			reader.close();
			
			//정렬
			//1차 정렬. 나이가 많은 순서대로 정렬
			//2차 정렬. 성별 정렬(알파벳순) 정렬
			System.out.println("=== 나이가 많은 순서대로, 나이가 같다면 성별 순서대로 정렬 ===");
			list.sort((u1, u2) -> {
				
				if(u1.getAge() > u2.getAge()) {
					return -1;
				} else if (u1.getAge() < u2.getAge()) {
					return 1;
				} else {
					
					if(u1.getGender().compareTo(u2.getGender()) > 0) {
						return -1;
					} else if (u1.getGender().compareTo(u2.getGender()) < 0) {
						return 1;
					} else {
						
						if(u1.getCity().compareTo(u2.getCity()) > 0) {
							return 1;
						} else if (u1.getCity().compareTo(u2.getCity()) < 0) {
							return -1;
						} else {
							return 0;
						}
						
					}
					
				}
				
			});
						
			for(User user : list) {
				System.out.printf("%s. %s(%d) %s %s\n"
						 			, user.getNo()
						 			, user.getName()
						 			, user.getAge()
						 			, user.getGender()
						 			, user.getCity());
			}
			
		} catch(Exception e) {
			e.printStackTrace();
		}
		
	} //m3
}

//1,홍길동.25,M,서울,010-1234-5678
class User {
	
	private String no;
	private String name;
	private int age;
	private String gender;
	private String city;
	private String tel;
	
	public User(String no, String name, int age, String gender, String city, String tel) {
		this.no = no;
		this.name = name;
		this.age = age;
		this.gender = gender;
		this.city = city;
		this.tel = tel;
	}
	
	public String getNo() {
		return no;
	}
	
	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public String getGender() {
		return gender;
	}

	public String getCity() {
		return city;
	}

	public String getTel() {
		return tel;
	}

	@Override
	public String toString() {
		return "User [no=" + no + ", name=" + name + ", age=" + age + ", gender=" + gender + ", city=" + city + ", tel="
				+ tel + "]";
	}
	
}

'자바(JAVA)' 카테고리의 다른 글

[자바(Java)] Collections  (0) 2022.12.16
[자바(Java)] Set  (0) 2022.12.16
[자바(Java)] Arrays  (0) 2022.12.16
[자바(Java)] Iterator  (0) 2022.12.15
[자바(Java)] Stack, Queue  (0) 2022.12.15