2013-01-22 99 views
15

Tôi có một arraylist với các giá trị chuỗi nhưCách sắp xếp Ngày có định dạng chuỗi trong 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"); 

bất kỳ cơ thể có thể giúp tôi về sắp xếp danh sách trên? Vì vậy, các giá trị được sắp xếp theo định dạng AM và PM.
Sản lượng dự kiến ​​sau khi sắp xếp phải là

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

câu hỏi rất hay! –

Trả lời

51

thử này

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); 
      } 
     } 
    }); 

hoặc với 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

cảm ơn rất nhiều điều này đã làm việc hoàn hảo cho kịch bản của tôi .. – user1740005

+0

Cảm ơn rất nhiều ... 1 phiếu bầu – vicky

+0

Tôi không có thời gian trong chuỗi của mình. Định dạng là yyyy-MM-dd. Khi tôi cố gắng sắp xếp theo phương pháp trên, danh sách vẫn giữ nguyên. Hãy giúp tôi. – Aradhna

0

Có lẽ bạn có thể viết một so sánh tùy chỉnh để so sánh Ngày Strings và thứ tự dựa trên yêu cầu. Sau đó, bạn sẽ có thể sắp xếp bộ sưu tập với bộ so sánh được triển khai.

2

Trong khi có cách kỹ thuật để giải quyết vấn đề của bạn, lỗi cơ bản là đại diện cho Date s là String s, một dạng 'ám ảnh nguyên thủy'. Nếu bạn có kiểu nhập văn bản, hãy chuyển đổi nó thành java.util.Date hoặc một lớp joda thích hợp (LocalDateTime có vẻ phù hợp tại đây). Các lớp này thực hiện Comparable ngoài hộp và sắp xếp chúng dễ dàng. Nhưng họ cũng có tất cả các logic khác trên tàu bạn có thể cần khi thao tác ngày/thời gian trường hợp, Strings không.

0

Một tùy chọn là thêm ngày vào TreeMap, với ngày chưa định dạng là khóa và ngày được định dạng làm giá trị. Sử dụng TreeMap sẽ sắp xếp các giá trị tự động.

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

Bạn có thể so sánh Danh sách ngày theo định dạng chuỗi bằng cách sử dụng compareTo như được đưa ra bên dưới.

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); 
       } 
      }); 

Bằng cách sử dụng này, bạn thậm chí không cần phải phân tích các chuỗi vào ngày

Các vấn đề liên quan