본문 바로가기
이론/Data Structure , Algorithm

[210529] 자바 문제 리딩 Compare()

by 6161990 2021. 5. 29.

지금껏 풀면서 가장 어려운 문제를 만났다 ;; 

 

문제

4개의 항목이 있는 csv(쉼표로 구분) 파일을 읽어들여 지정된 순서로 정렬하여 표시하는 프로그램을 만드세요. 

 

4개 항목

  • 날짜 
  • 최고기온
  • 최저기온
  • 평균기온

표시순서

  • 최고 기온이 높은 순
  • 최저 기온이 높은 순
  • 평균 기온이 높은 순
  • 날짜가 오래된 순

4개의 순서에 대한 우선순위로 표시할 때 열 순서는 같습니다.

로드하는 파일은 data.csv이며 정렬 순서 구분을 하기 위해 Temperature Comparator 클래스 정렬을 사용합니다. 

 

 


weather 클래스

 

우선...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[] 에 하나씩 꺼냈다. 

 

 

여기까진 가능했다. 그런데 .....

 


data.csv 파일과 Comparator 재정의 클래스 

 

 

 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)

 

 

 

 

문제도 다 풀고 디버깅도 끝난 코드! 뿌듯... 오래 걸렸지만 그만큼 뿌듯 

다음에 풀면 좀 덜 걸리겠지 ?