- 컬렉션을 정렬하는 데 필요한 메서드를 정의한 인터페이스
- 두 객체의 비교 결과를 반환하도록 작성해야 한다.(같으면 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 |