2016-02-27 175 views
1

我有一個List<String>,其中包含從上午8:00到下午4:00的時間列表。在Java中對ArrayList進行排序

當我在輸出中顯示它時,它顯示未排序,當我使用Collections.sort(myList);時,它將它從下午1:00到上午8:00分類。

如何從上午8:00到下午4:00對列表進行排序?

+0

在列表中使用24小時時間格式,然後對其進行分類。 您可以隨時將其還原爲AM和PM。 – Rohit5k2

回答

6

不要重新發明輪子,用集合(或lambda表達式標準化Date

  • 排序如果java8被允許) How:: 將列表保留爲字符串,但使用Anonymous 比較器,在那裏,解析字符串日期,比較它們,你有它。 這裏一個片段:

    List<String> l = new ArrayList<String>(); 
    l.add("8:00 am"); 
    l.add("8:32 am"); 
    l.add("8:10 am"); 
    l.add("1:00 pm"); 
    l.add("3:00 pm"); 
    l.add("2:00 pm"); 
    Collections.sort(l, new Comparator<String>() { 
    
        @Override 
        public int compare(String o1, String o2) { 
         try { 
          return new SimpleDateFormat("hh:mm a").parse(o1).compareTo(new SimpleDateFormat("hh:mm a").parse(o2)); 
         } catch (ParseException e) { 
          return 0; 
         } 
         } 
        }); 
        System.out.println(l); 
    
  • +0

    偉大的答案,謝謝。 :) –

    +0

    不客氣 –

    0

    在列表中使用24小時時間格式,然後對其進行排序。

    您可以隨時將其恢復爲AM和PM。

    2

    將您的字符串轉換爲日期並對日期進行排序。在Java中,你應該總是處理對象,而不是字符串。字符串是名稱或其他文本,當有一個字符串的特殊含義時,您最好將其轉換爲有意義的對象。

    0

    這是一個簡短的程序,你想要做什麼。

    public static void main(String[] args) throws ParseException { 
        ArrayList<String> times = new ArrayList<String>(); 
        times.add("8:00 pm"); 
        times.add("8:00 am"); 
        times.add("7:00 pm"); 
        times.add("7:00 am"); 
        ArrayList<Date> dates = new ArrayList<Date>(); 
        DateFormat format = new SimpleDateFormat("h:m a", Locale.ENGLISH); 
        for(String time : times){ 
         dates.add(format.parse(time)); 
        } 
        Collections.sort(dates); 
        System.out.println(dates); 
    } 
    

    步驟:

    • 每個字符串轉換爲使用Collections.sort()
    0

    與其他人一樣,我建議不要重新發明輪子,我也建議丟棄舊的和過時的類SimpleDateFormatDate。這些日子我們好多了。

    鑑於

    static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH); 
    

    我們可以做

    Collections.sort(listOfTimeStrings, 
            Comparator.comparing(
              (String s) -> LocalTime.parse(s.toUpperCase(), dtf))); 
    

    這將很好地工作了幾百串,也許更多。但是,每次要比較兩個字符串時都會解析每個字符串。這可能是很多次。如果要分析每個字符串只有一次,而不是做:

    List<String> sortedList = listOfTimeStrings.stream() 
          .map(String::toUpperCase) 
          .map(s -> LocalTime.parse(s, dtf)) 
          .sorted() 
          .map(dtf::format) 
          .map(String::toLowerCase) 
          .collect(Collectors.toList()); 
    

    我已經從字面上看它,當你給上午和下午在小寫,所以我將在分析之前爲大寫並返回格式化後小寫。根據您的數據,您可以跳過這些步驟。

    相關問題