2014-09-05 2 views
1

날짜 배열을 만들고 정렬하려고합니다. 이것이 내가 어떻게 할 수 있었는지는 모르지만 이것이 내가 필요한 것이 아니다.Java의 문자열 배열에서 날짜를 정렬하는 방법은 무엇입니까?

java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd-MM-yyyy"); 
    java.util.Date date1 = sdf.parse("05-03-2014"); 
    java.util.Date date2 = sdf.parse("23-08-2014"); 
    java.util.Date dates[] = {date1, date2}; 
    java.util.Arrays.sort(dates); 
    System.out.println(java.util.Arrays.toString(dates)); 

I은 ​​문자열 배열을 갖고 있기 때문에 "문자열 날짜 [] = {"2014년 5월 11일 ","23-08-2014 ","2013년 5월 2일 "}" 그래서 문자열 배열에서 날짜를 정렬해야합니다. 코드를 어떻게 변경합니까?

답변

5

더 좋은 방법은 그 다음 arrayOfDates을 정렬하고 필요하면 다시 dates 배열에 결과를 포맷 SimpleDateFormat를 사용 Date

Date[] arrayOfDates = new Date[dates.length]; 
for (int index = 0; index < dates.length; index++) { 
    arrayOfDates[index] = sdf.parse(dates[index]); 
} 

의 배열에 String 배열을 변환하는 것입니다 .. . 이것은 하나 또는 dates 배열의 값을 더는 유효하지 않은 형태 인 경우 당신이 무엇을해야하는지에 걸쳐 더 많은 컨트롤을 제공

Arrays.sort(arrayOfDates); 
for (int index = 0; index < dates.length; index++) { 
    dates[index] = sdf.format(arrayOfDates[index]); 
} 

에서.

또 다른 "더러운"해결책은 의 값을 Date 인라인으로 변환하고 비교하는 사용자 지정 Comparator을 사용하는 것입니다.

이 당신이 dates의 유효성을 보장 할 수 있다면 괜찮지 만, 때 수 없습니다 예를 들어, 붕괴 시작 ...

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Arrays; 
import java.util.Comparator; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class DirtySort { 

    public static void main(String[] args) { 
     String dates[] = {"05-11-2014", "23-08-2014","05-02-2013"}; 
     Arrays.sort(dates, new Comparator<String>() { 
      private SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd-MM-yyyy"); 
      @Override 
      public int compare(String o1, String o2) { 
       int result = -1; 

       try { 
        result = sdf.parse(o1).compareTo(sdf.parse(o2)); 
       } catch (ParseException ex) { 
        ex.printStackTrace(); 
       } 

       return result; 
      } 
     }); 

     for (String date : dates) { 
      System.out.println(date); 
     } 
    } 

} 
+0

두 가지 방법이 잘 작동하고 모두 동일한 결과를 인쇄 :'2013년 5월 2일 23-08-2014 05-11-2014'합니다. –

+0

Java 8 (또는 그 이상)을 사용하고 있다면 스트림과'java.time.LocalDate'로 뭔가를 할 것입니다. –

1

를 사용하여 날짜 - 시간 유형

answer by MadProgrammer이 맞습니다. 날짜 - 시간 값을 사용하여 작업 할 때는 날짜 - 시간 데이터 유형으로 작업하십시오. 일반적으로 가장 좋습니다. 숫자를 나타내는 많은 문자열이 있다면 비즈니스 로직을위한 숫자 데이터 유형으로 변환하지 않겠습니까?

피가 java.util.Date

다른 대답에 내 유일한 개선은 java.util.Date를 사용에 대해 조언을하는 것입니다. Java와 함께 번들로 제공되는 클래스와 .Calendar는 모두 골칫거리이며 피해야합니다.

대신 Joda-Time에서 영감을 얻은 Java 8의 Joda-Time 라이브러리 또는 java.time package을 사용하십시오.

날짜 전용

두 Joda 타임 및 시간의 일 또는 시간대없이 날짜 만 값을 처리하는 LocalDate 클래스를 제공 java.time. 이 질문에 대한 것.

Joda 타임 우리는 parseLocalDate를 호출하여 문자열을 구문 분석하는 DateTimeFormatter를 사용합니다. 데이터 소스를 신뢰할 수 없다면 IllegalArgumentException에 잡으십시오.

다음은 Joda-Time 2.4를 사용하는 일부 코드입니다.

List<LocalDate> list = new ArrayList<LocalDate>(); 
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-yyyy"); 
String dates[] = { "05-11-2014" , "23-08-2014" , "05-02-2013" }; 
for (String string : dates) { 
    LocalDate localDate = formatter.parseLocalDate(string); 
    list.add(localDate); 
} 
Collections.sort(list); 

콘솔에 덤프. 원본 형식으로 출력하십시오.

System.out.println("list: " + list); 

StringBuilder output = new StringBuilder("Localized sorted list of dates: "); 
for (LocalDate localDate : list) { 
    output.append(formatter.print(localDate)).append(" | "); 
} 
System.out.println(output); 

실행시. lambdas와 함께 새로운 자바 (8) 구문을 사용하여

list: [2013-02-05, 2014-08-23, 2014-11-05] 
Localized sorted list of dates: 05-02-2013 | 23-08-2014 | 05-11-2014 | 

또는. 그게 개선인지 아닌지는 확실하지 않습니다.

List<LocalDate> list = new ArrayList<>(); 
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-yyyy"); 
String[] dateStringsArray = { "05-11-2014" , "23-08-2014" , "05-02-2013" }; 
List<String> dateStringsList = new ArrayList<>(Arrays.asList(dateStringsArray)); 
dateStringsList.stream().map((string) -> formatter.parseLocalDate(string)).forEach((localDate) -> { 
    list.add(localDate); 
}); 
Collections.sort(list); 

System.out.println("list: " + list); 

StringBuilder output = new StringBuilder("Localized sorted list of dates: "); 
list.stream().forEach((localDate) -> { 
    output.append(formatter.print(localDate)).append(" | "); 
}); 
System.out.println(output); 

관련 문제