지금껏 풀면서 가장 어려운 문제를 만났다 ;;
문제
4개의 항목이 있는 csv(쉼표로 구분) 파일을 읽어들여 지정된 순서로 정렬하여 표시하는 프로그램을 만드세요.
4개 항목
- 날짜
- 최고기온
- 최저기온
- 평균기온
표시순서
- 최고 기온이 높은 순
- 최저 기온이 높은 순
- 평균 기온이 높은 순
- 날짜가 오래된 순
4개의 순서에 대한 우선순위로 표시할 때 열 순서는 같습니다.
로드하는 파일은 data.csv이며 정렬 순서 구분을 하기 위해 Temperature Comparator 클래스 정렬을 사용합니다.
우선...weather클래스를 만들었다.
13-14 버퍼로 감싼 파일리딩을 했고
17 읽어온 파일을 한줄씩 String msg 변수에 담았다.
18 그 한줄을 (,) 단위로 잘라 String[] msgs 변수에 담았고
19 msgs를 ArrayList의 String []에 또 담았다.
21 Temperature Comparator 생성자를 만들었고
22 Collections.sort()에 정렬이 필요한 객체와 Comparator를 재정의한 객체를 던졌다.
.sort(List<T> list , Comparator<? super T> c)
인자 1 : 정렬하고자 하는 List 변수명
인자 2 : Comparator 인터페이스를 구현한 클래스의 인스턴스 (여기서는 tc)
23 향상된 for문을 이용해 정렬된 tempList 객체를 msgs[] 에 하나씩 꺼냈다.
여기까진 가능했다. 그런데 .....
Comparator 인터페이스를 한번도 재정의해본적이 없어서 난감했다.
인터넷을 여기저기 뒤져도 내게는 너무 복잡한 알고리즘 같아 보였다. 결국 손으로 풀었다.
Compare() 메서드 작성법
- 첫번째 파라미터로 넘어온 객체 < 두번째 파라미터로 넘어온 객체 : 음수 리턴
- 첫번째 파라미터로 넘어온 객체 = 두번째 파라미터로 넘어온 객체 : 0 리턴
- 첫번째 파라미터로 넘어온 객체 > 두번째 파라미터로 넘어온 객체 : 양수 리턴
: 음수 또는 0 이면 객체의 자리가 그대로 유지되며 , 양수인 경우에는 두 객체의 자리가 변경된다.
우선 내가 풀었던 소스엔 평균 기온에서 return 값을 1이어야 할 것은 -1로 , -1이어야 할 것은 1로 적어놓았다...(실수;)
그렇게되면 평균 기온은 역순으로 정렬되는데, 문제의 조건에서는 내림차순으로 정렬하라고 했기 때문에 틀린 게 된다.
또한, 이 문제에서 before메소드는 처음봤다. 날짜 순을 계산해주는 메소드 같은데 은근 헷갈려서 다시 정리해보았다.
{Date 개체}. before{(비교대상)}
=> {(비교대상)}이 {Date 개체}보다 이전인가?
{Date 개체}. after{(비교대상)}
=> {(비교대상)}이 {Date 개체}보다 이후인가?
문제에서는 날짜를 오래된 순(역순)으로 정렬하라고 했기 때문에 생각하다보면 헷갈린다 ;;
if {date1}. before{(date2)} == True ,
즉, date2가 date1보다 이전이면, 이전먼저 정렬해야되기 때문에 자리 바꿈이 일어나도록 return 값이 1로 한다.
최고기온, 최저기온, 평균기온을 모두 똑같이 해놓고 날짜가 역순으로 정렬되는지 보려고 했는데,
그랬는데 오류가 또 난다.
자세히 들여다보니 SimpleDateFormat에서 데이트 포맷을 파일 안에 있던 포맷과 다르게 두고 있었다. 아래와 같이......
SimpleDateFormat(yyyy/MM/dd) != data.csv 안의 date 포맷(yyyy.MM.dd)
SimpleDateFormat을 data.csv 파일 안에 있는 날짜 포맷으로 맞춰주었다.
SimpleDateFormat(yyyy.MM.dd)
문제도 다 풀고 디버깅도 끝난 코드! 뿌듯... 오래 걸렸지만 그만큼 뿌듯
다음에 풀면 좀 덜 걸리겠지 ?
'이론 > Data Structure , Algorithm' 카테고리의 다른 글
[210915] 백준 2920번 문제 풀이 / 음계 (0) | 2021.09.15 |
---|---|
[210614] 자바 문제 리딩, static (0) | 2021.06.14 |
[210614] 자바 문제 리딩, 객체와 은닉화 (0) | 2021.06.14 |
[210601] 자바 문제 리딩, 전치 행렬 (0) | 2021.06.01 |
[210530] 자바 문제 리딩 , 배열에서 가장 큰 값과 작은 값 구하기 (0) | 2021.05.30 |