2013-01-22 10 views
15

Mam arraylist z ciągów znaków jakJak sortować datę w formacie tekstowym w java?

ArrayList<String> datestring=new ArrayList<String>(); 
datestring.add("01/21/2013 @03:13 PM"); 
datestring.add("01/21/2013 @04:37 PM"); 
datestring.add("01/21/2013 @10:41 AM"); 
datestring.add("01/21/2013 @10:48 AM"); 
datestring.add("01/22/2013 @06:16 AM"); 
datestring.add("01/22/2013 @06:19 AM"); 
datestring.add("01/21/2013 @05:19 PM"); 
datestring.add("01/21/2013 @05:19 PM"); 

Czy każdy podmiot może mi pomóc w sortowaniu powyższą listę? Aby wartości zostały posortowane zgodnie z formatem AM i PM.
Oczekiwana moc po sortowaniu powinien być

for (String s : datestring) 
{ 
    System.out.println(s); 
} 

.

01/21/2013 @10:41 AM; 
01/21/2013 @10:48 AM; 
01/21/2013 @03:13 PM; 
01/21/2013 @04:37 PM; 
01/21/2013 @05:16 PM; 
01/21/2013 @05:19 PM; 
01/22/2013 @06:16 AM; 
01/22/2013 @06:19 AM; 
+0

wielkie pytanie! –

Odpowiedz

51

spróbować

Collections.sort(datestring, new Comparator<String>() { 
     DateFormat f = new SimpleDateFormat("MM/dd/yyyy '@'hh:mm a"); 
     @Override 
     public int compare(String o1, String o2) { 
      try { 
       return f.parse(o1).compareTo(f.parse(o2)); 
      } catch (ParseException e) { 
       throw new IllegalArgumentException(e); 
      } 
     } 
    }); 

lub z Java 8

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy '@'hh:mm a"); 
    Collections.sort(datestring, (s1, s2) -> LocalDateTime.parse(s1, formatter). 
      compareTo(LocalDateTime.parse(s2, formatter))); 
+0

dziękuję bardzo to działało idealnie do mojego scenariusza .. – user1740005

+0

Dziękuję bardzo ... +1 głosowanie – vicky

+0

Nie mam czasu w moim napisie. Format to rrrr-MM-dd. Kiedy próbuję sortować powyższą metodą, lista pozostaje taka sama. proszę pomóż. – Aradhna

0

Prawdopodobnie można napisać niestandardowy porównawczy dla porównania Data Ciągi i kolejność na podstawie wymagań. Wtedy będziesz mógł sortować kolekcję za pomocą zaimplementowanego komparatora.

2

Chociaż istnieje techniczny sposób na obejście problemu, podstawowym błędem jest reprezentowanie Date s jako String s, forma "prymitywnej obsesji". Jeśli posiadasz dane tekstowe, przekonwertuj je na java.util.Date lub odpowiednią klasę joda (LocalDateTime wydaje się tutaj odpowiednie). Te klasy implementują po wyjęciu z pudełka Comparable, a ich sortowanie jest łatwe. Ale mają też całą inną logikę na pokładzie, której prawdopodobnie będziesz potrzebować podczas manipulowania instancjami daty/czasu, Ciągi nie.

0

Jedną z opcji jest dodanie dat do mapy drzewa z niesformatowaną datą jako kluczem i sformatowaną datą jako wartością. Korzystanie z mapy drzewa automatycznie sortuje wartości.

private ArrayList<String> sortDates(ArrayList<String> dates) throws ParseException { 
    SimpleDateFormat f = new SimpleDateFormat("dd MMM yyyy"); 
    Map <Date, String> dateFormatMap = new TreeMap<>(); 
    for (String date: dates) 
     dateFormatMap.put(f.parse(date), date); 
    return new ArrayList<>(dateFormatMap.values()); 
} 
0

Można porównać listę daty w formacie ciągowym za pomocą porównaniaTo jak podano poniżej.

ArrayList<String> datestring=new ArrayList<String>(); 
datestring.add("01/21/2013 @03:13 PM"); 
datestring.add("01/21/2013 @04:37 PM"); 
datestring.add("01/21/2013 @10:41 AM"); 
datestring.add("01/21/2013 @10:48 AM"); 
datestring.add("01/22/2013 @06:16 AM"); 
datestring.add("01/22/2013 @06:19 AM"); 
datestring.add("01/21/2013 @05:19 PM"); 
datestring.add("01/21/2013 @05:19 PM"); 

Collections.sort(datestring, new Comparator<String>() { 
       @Override 
       public int compare(String object1, String object2) { 
        return object1.compareTo(object2); 
       } 
      }); 

za pomocą tego nawet nie trzeba analizować String na bieżąco

Powiązane problemy