import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import java.util.Collections;
import java.util.Comparator;
import java.util.Arrays;
import java.text.SimpleDateFormat;
import java.text.DateFormat;
public class DateTestMain {
public static void main(String[] args) {
// 테스트를 위한 초기값 설정
DateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSSS");
TestDate td1 = new TestDate("td1", "td1");
TestDate td2 = new TestDate("td2", "td2");
TestDate td3 = new TestDate("td3", "td3");
TestDate td4 = new TestDate("td4", "td4");
TestDate td5 = new TestDate("td5", "td5");
TestDate td6 = new TestDate("td6", "td6");
TestDate td7 = new TestDate("td7", "td7");
TestDate td8 = new TestDate("td8", "td8");
TestDate td9 = new TestDate("td9", "td9");
TestDate td10 = new TestDate("td10", "td10");
// Date 값의 비교를 위해 for문을 100만 번 씩 반복 하였습니다.
if(td1.getRegister_Dt()==null) td1.setRegister_Dt(new Date());
if(td1.getTmpField1()==null || "".equals(td1.getTmpField1())) td1.setTmpField1("080");
for(int i=0; i<1000000; i++) {}
if(td2.getRegister_Dt()==null) td2.setRegister_Dt(new Date());
if(td2.getTmpField1()==null || "".equals(td2.getTmpField1())) td2.setTmpField1("075");
for(int i=0; i<1000000; i++) {}
if(td3.getRegister_Dt()==null) td3.setRegister_Dt(new Date());
if(td3.getTmpField1()==null || "".equals(td3.getTmpField1())) td3.setTmpField1("070");
for(int i=0; i<1000000; i++) {}
if(td4.getRegister_Dt()==null) td4.setRegister_Dt(new Date());
if(td4.getTmpField1()==null || "".equals(td4.getTmpField1())) td4.setTmpField1("100");
for(int i=0; i<1000000; i++) {}
if(td5.getRegister_Dt()==null) td5.setRegister_Dt(new Date());
if(td5.getTmpField1()==null || "".equals(td5.getTmpField1())) td5.setTmpField1("005");
for(int i=0; i<1000000; i++) {}
if(td6.getRegister_Dt()==null) td6.setRegister_Dt(new Date());
if(td6.getTmpField1()==null || "".equals(td6.getTmpField1())) td6.setTmpField1("010");
for(int i=0; i<1000000; i++) {}
if(td7.getRegister_Dt()==null) td7.setRegister_Dt(new Date());
if(td7.getTmpField1()==null || "".equals(td7.getTmpField1())) td7.setTmpField1("020");
for(int i=0; i<1000000; i++) {}
if(td8.getRegister_Dt()==null) td8.setRegister_Dt(new Date());
if(td8.getTmpField1()==null || "".equals(td8.getTmpField1())) td8.setTmpField1("100");
for(int i=0; i<1000000; i++) {}
if(td9.getRegister_Dt()==null) td9.setRegister_Dt(new Date());
if(td9.getTmpField1()==null || "".equals(td9.getTmpField1())) td9.setTmpField1("005");
for(int i=0; i<1000000; i++) {}
if(td10.getRegister_Dt()==null) td10.setRegister_Dt(new Date());
if(td10.getTmpField1()==null || "".equals(td10.getTmpField1())) td10.setTmpField1("010");
List<TestDate> tdList = Arrays.asList(td2, td1, td3, td10, td5, td8, td9, td4, td6, td7); // 테스트용 List
for(TestDate td : tdList) // List에 값이 어떤식으로 저장되어 있는지 확인 하기 위해 출력
System.out.println("userName : " + td.getUserName() + " / reg_dt : " + df.format(td.getRegister_Dt()));
// 출력 결과
/*
* userName : td2 / reg_dt : 2020.08.25 09:08:35.0816
* userName : td1 / reg_dt : 2020.08.25 09:08:35.0809
* userName : td3 / reg_dt : 2020.08.25 09:08:35.0818
* userName : td10 / reg_dt : 2020.08.25 09:08:35.0830
* userName : td5 / reg_dt : 2020.08.25 09:08:35.0821
* userName : td8 / reg_dt : 2020.08.25 09:08:35.0826
* userName : td9 / reg_dt : 2020.08.25 09:08:35.0828
* userName : td4 / reg_dt : 2020.08.25 09:08:35.0820
* userName : td6 / reg_dt : 2020.08.25 09:08:35.0823
* userName : td7 / reg_dt : 2020.08.25 09:08:35.0825
*/
//=============== 정렬 시작 ===============
/*
* Option 1
* Collections.sort() with Comparator
*/
Collections.sort(tdList, new Comparator<TestDate>() { // 익명객체 사용
@Override
public int compare(TestDate arg1, TestDate arg2) { // Sort Order By asc
return arg1.getRegister_Dt().compareTo(arg2.getRegister_Dt()); // arg1 - 기준 값, arg2 - 비교 값
}
});
Collections.sort(tdList, new Comparator<TestDate>() { // 익명객체 사용
@Override
public int compare(TestDate arg1, TestDate arg2) { // Sort Order By desc
return arg2.getRegister_Dt().compareTo(arg1.getRegister_Dt()); // arg2 - 기준 값, arg1 - 비교 값
}
});
/*
* Option 2
* List interface sort() [Java 8]
*/
tdList.sort(Comparator.comparing(TestDate::getRegister_Dt)); // Sort Order By asc - Comparator의 comparing 사용, ::를 활용한 참조 방식 사용
tdList.sort(Comparator.comparing(TestDate::getRegister_Dt).reversed()); // Sort Order By desc - Comparator의 comparing 사용, ::를 활용한 참조 방식 사용, reversed 사용시 내림차순
/*
* Option 3
* Stream interface sorted() [Java 8]
*/
List<TestDate> ascTD = tdList.stream() // Sort Order By asc - Comparator의 comparing 사용, ::를 활용한 참조 방식 사용, stream을 활용한 List의 sorted사용 및 collect를 활용한 Collectors.toList() 사용
.sorted(Comparator.comparing(TestDate::getRegister_Dt))
.collect(Collectors.toList());
List<TestDate> descTD = tdList.stream() // Sort Order By desc - Comparator의 comparing 사용, ::를 활용한 참조 방식 사용, stream을 활용한 List의 sorted사용 및 collect를 활용한 Collectors.toList() 사용, reversed 사용시 내림차순
.sorted(Comparator.comparing(TestDate::getRegister_Dt).reversed())
.collect(Collectors.toList());
//=============== 정렬 종료 ===============
/*
* 위 Option 1~3 까지의 방식 중 하나를 사용하셔서 정렬을 하신 후 출력을 해보시면 다음과 같은 결과를 확인하실 수 있습니다.
* 여기서는 desc (내림차순) 방식으로 정렬 및 테스트를 진행 하였습니다.
*/
for(TestDate td : tdList)
System.out.println("userName : " + td.getUserName() + " / reg_dt : " + df.format(td.getRegister_Dt()));
// 출력 결과
/*
* userName : td10 / reg_dt : 2020.08.25 09:08:35.0830
* userName : td9 / reg_dt : 2020.08.25 09:08:35.0828
* userName : td8 / reg_dt : 2020.08.25 09:08:35.0826
* userName : td7 / reg_dt : 2020.08.25 09:08:35.0825
* userName : td6 / reg_dt : 2020.08.25 09:08:35.0823
* userName : td5 / reg_dt : 2020.08.25 09:08:35.0821
* userName : td4 / reg_dt : 2020.08.25 09:08:35.0820
* userName : td3 / reg_dt : 2020.08.25 09:08:35.0818
* userName : td2 / reg_dt : 2020.08.25 09:08:35.0816
* userName : td1 / reg_dt : 2020.08.25 09:08:35.0809
*/
// 추가로 날짜 정렬 이후, 우선 순위에 따라 정렬을 해보고 결과를 확인해 보겠습니다. (desc-내림차순 정렬 사용)
tdList.sort(Comparator.comparing(TestDate::getTmpField1).reversed()); // 소스코드가 짧아서 이렇게 썼습니다. (사실은 귀찮아서...)
for(TestDate td : tdList)
System.out.println("userName : " + td.getUserName() + " / tmpField : " + td.getTmpField1());
// 출력 결과
/*
* userName : td8 / tmpField : 100
* userName : td4 / tmpField : 100
* userName : td1 / tmpField : 080
* userName : td2 / tmpField : 075
* userName : td3 / tmpField : 070
* userName : td7 / tmpField : 020
* userName : td10 / tmpField : 010
* userName : td6 / tmpField : 010
* userName : td9 / tmpField : 005
* userName : td5 / tmpField : 005
*/
}
}