【问题标题】:How to sort the earliest time stamp in the list in java?java 如何对列表中最早的时间戳进行排序?
【发布时间】:2019-10-20 08:36:11
【问题描述】:
package collectionCollections;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.concurrent.SynchronousQueue;

public class TestCollections {

 public static void main(String[] args) {

  String a = "9:50 PM,12:25 PM,3:55 PM,10:15 PM,1:15 PM";
  ArrayList al2 = new ArrayList();
  ArrayList al3 = new ArrayList();
  String arg[] = a.split(",");
  // System.out.println(arg);
  // Collections.sort(list);
  List < String > al = new ArrayList < String > ();
  al = Arrays.asList(arg);
  for (String s: al) {
   System.out.println(s);
   al2.add(s.substring(0, 5).replace(':', '.'));
  }
  System.out.println(al2);
  Iterator li = al2.iterator();
  while (li.hasNext()) {
   String s = (String) li.next();
   float no = Float.parseFloat(s);
   al3.add(no);
  }
  Collections.sort(al3);
  int add = 0;
  float ff = 0;
  ListIterator lit = al3.listIterator();
  while (lit.hasNext()) {

   float f = (Float) lit.next();
   int intno = (int) f;
   if (intno == 12) {
    add = intno;
    ff = f - add;
    System.out.println(ff);
    lit.remove();
   }
  }
  al3.add(0, add + ff);
  System.out.println(al3);
 }
}

(`我正在尝试对以下数组列表进行排序:

my Timestamps = [12:40 PM, 4:00 PM, 7:20 PM, 10:40 PM, 12:00 PM, 3:25 PM, 6:50 PM, 10:15 PM, 6:35 PM, 9:50 PM, 12:20 PM, 3:45 PM, 7:15 PM, 10:40 PM, 11:45 AM, 3:10 PM, 6:35 PM, 10:25 PM, 12:50 PM, 4:10 PM, 7:30 PM, 10:40 PM]

预期结果在第 0 个索引中显示最早的 11:45 AM。

我尝试将上面的列表转换为整数,并且当在特定时间(下午 12:35)有唯一时间(AM/PM)时,我能够对其进行排序,但是当特定时间有多个时间戳时(12: 35 PM,12:05 PM)我无法排序。

【问题讨论】:

    标签: java list time java-time datetime-parsing


    【解决方案1】:

    对您来说最简单的解决方案之一是下面的代码,您的代码几乎没有变化:

    • 在排序前将 12:mm AM/PM 转换为 00:mm AM/PM
    • 将 hh:mm AM 转换为 hh.mm 并将 hh:mm 转换为 (hh+12).mm
    • 对列表进行排序
    • 将 hh.mm 转换为 hh:mm AM/PM

      package collectionCollections;
      
      import java.util.ArrayList;
      import java.util.Arrays;
      import java.util.Collections;
      import java.util.Iterator;
      import java.util.List;
      import java.util.ListIterator;
      import java.util.concurrent.SynchronousQueue;
      
      public class TestCollections {
      
      public static void main(String[] args) {
      
          //String a = "9:50 PM,12:25 PM,3:55 PM,10:15 PM,1:15 PM";
          String a = "9:50 PM,12:25 PM,3:55 PM,10:15 PM,1:15 PM,1:00 AM, 12:25 AM, 10:13 AM";
          List<String> al2 = new ArrayList<>();
          List<Float> al3 = new ArrayList<>();
          List<String> al4 = new ArrayList<>(); // list of final results to display
          String arg[] = a.split(",");
          // System.out.println(arg);
          // Collections.sort(list);
          List<String> al = new ArrayList<String>();
          al = Arrays.asList(arg);
          for (String s : al) {
              System.out.println(s);
              s  = s.trim(); // remove leading and trailing spaces, otherwise the conversion to float will fail
              s = s.replace("12:", "00:"); // do not forget 12:00 is like 00:00 and 12:00 AM/PM is least than 1:00 AM/PM
              String[] t = s.split(" ");
              String ampm = t[1]; // extract AM/PM
              System.out.println("ampm "+ ampm );
              if( ampm.toUpperCase().equals("PM")) {
                  String h = t[0].split(":")[0]; // extract hours
                  int hh = 12 + Integer.parseInt(h); // add 12 for PM
                  t[0] = t[0].replace(h+":", hh+":");
              }
      
              al2.add(t[0].replace(":", "."));
          }
          System.out.println(al2);
          Iterator li = al2.iterator();
          while (li.hasNext()) {
              String s = (String) li.next();
              float no = Float.parseFloat(s);
              System.out.println(" s -> no : "+ s +" -> "+ no);
              al3.add(no);
          }
      
          Collections.sort(al3);
          ListIterator lit = al3.listIterator();
          while (lit.hasNext()) {
      
              float f = (Float) lit.next();
              int intno = (int) f;
              if(intno < 12 ) {
                  int hour12 = intno == 0 ? 12 : intno; // replace 00:xx am by 12:xx am
                  al4.add(hour12 +":"+ ((int)((f-intno)*100)) +" AM");
              }
              else {
                  al4.add((intno-12)+":"+ ((int)((f-intno)*100)) +" PM");
              }
          }
          System.out.println(al4);
      }
      }
      

    附清单

    String a = "9:50 PM,12:25 PM,3:55 PM,10:15 PM,1:15 PM,1:00 AM, 12:25 AM, 10:13 AM";
    

    结果是:

    [12:25 AM, 1:0 AM, 10:13 AM, 0:25 PM, 1:14 PM, 3:55 PM, 9:50 PM, 10:14 PM]
    

    更高效的代码将在稍后的编辑中推出。

    【讨论】:

      【解决方案2】:

      一个问题是像4 PM 这样的时间将在您的列表中显示为4.0,因此在像11:45 AM 这样的时间之前(显示为11.45)。我建议看一下java.util.Date 和朋友之类的课程,并找到一个将这些时间转换为另一种格式的函数,例如自午夜以来的秒数或 24 小时表示法,然后按此格式排序。

      【讨论】:

        【解决方案3】:

        尝试使用此代码。它很紧凑。使用 Java8 定义一个比较器,它将完成我们对时间排序的工作。 `

          String arg[] = a.split(",");
          List < String > al = new ArrayList < String > ();
          al = Arrays.asList(arg);
        
        
          Collections.sort(al, (x,y)->{ 
          int result ;
          String[] splitx = x.trim().split("\\s+");
        String[] splity = y.trim().split("\\s+");
        if(splitx[1].equals("AM") && splity[1].equals("PM")) {
              result= -1;
          }else if (splitx[1].equals("PM") && splity[1].equals("AM")) {
              result= 1;
          }else {
              result= x.compareTo(y);
          }
        
          return result;
          });
        
          System.out.println(al);
        

        `

        供输入
        String a = "12:40 PM, 4:00 PM, 7:20 AM, 10:40 PM, 12:00 PM, 3:25 AM, 6:50 PM, 10:15 PM, 6:35 PM, 9:50 PM, 12:20 PM, 3:45 PM, 7:15 PM, 10:40 PM, 11:45 AM, 3:10 PM, 6:35 PM, 10:25 PM, 12:50 PM, 4:10 PM, 7:30 PM, 10:40 PM";

        输出将是:
        [ 11:45 AM, 3:25 AM, 7:20 AM, 10:15 PM, 10:25 PM, 10:40 PM, 10:40 PM, 10:40 PM, 12:00 PM, 12:20 PM, 12:50 PM, 3:10 PM, 3:45 PM, 4:00 PM, 4:10 PM, 6:35 PM, 6:35 PM, 6:50 PM, 7:15 PM, 7:30 PM, 9:50 PM, 12:40 PM] 希望它能解决您的问题。

        【讨论】:

          【解决方案4】:

          java.time

          我建议您使用modern date-time API*

          import java.time.LocalTime;
          import java.time.format.DateTimeFormatter;
          import java.time.format.DateTimeFormatterBuilder;
          import java.util.Arrays;
          import java.util.Collections;
          import java.util.List;
          import java.util.Locale;
          
          public class Main {
              public static void main(String args[]) {
                  String[] timeStrArr = { "12:40 PM", "4:00 PM", "7:20 PM", "10:40 PM", "12:00 PM", "3:25 PM", "6:50 PM",
                          "10:15 PM", "6:35 PM", "9:50 PM", "12:20 PM", "3:45 PM", "7:15 PM", "10:40 PM", "11:45 AM", "3:10 PM",
                          "6:35 PM", "10:25 PM", "12:50 PM", "4:10 PM", "7:30 PM", "10:40 PM" };
                  
                  List<String> timeList = Arrays.asList(timeStrArr);
                  
                  DateTimeFormatter timeFormat = new DateTimeFormatterBuilder()
                                                  .parseCaseInsensitive()
                                                  .appendPattern("h:m a")
                                                  .toFormatter(Locale.ENGLISH);
                  Collections.sort(timeList,
                          (s1, s2) -> LocalTime.parse(s1, timeFormat).compareTo(LocalTime.parse(s2, timeFormat)));
                  
                  System.out.println(timeList);
                  
                  System.out.println("Earliest time in the list: " + timeList.get(0));
              }
          }
          

          输出:

          [11:45 AM, 12:00 PM, 12:20 PM, 12:40 PM, 12:50 PM, 03:10 PM, 03:25 PM, 03:45 PM, 04:00 PM, 04:10 PM, 06:35 PM, 06:35 PM, 06:50 PM, 07:15 PM, 07:20 PM, 07:30 PM, 09:50 PM, 10:15 PM, 10:25 PM, 10:40 PM, 10:40 PM, 10:40 PM]
          Earliest time in the list: 11:45 AM
          

          更新:发布带有非 lamda 表达式的代码进行排序(由 OP 在 cmets 部分请求)

          import java.time.LocalTime;
          import java.time.format.DateTimeFormatter;
          import java.time.format.DateTimeFormatterBuilder;
          import java.util.Arrays;
          import java.util.Collections;
          import java.util.Comparator;
          import java.util.List;
          import java.util.Locale;
          
          public class Main {
              public static void main(String args[]) {
                  String[] timeStrArr = { "12:40 PM", "4:00 PM", "7:20 PM", "10:40 PM", "12:00 PM", "3:25 PM", "6:50 PM",
                          "10:15 PM", "6:35 PM", "9:50 PM", "12:20 PM", "3:45 PM", "7:15 PM", "10:40 PM", "11:45 AM", "3:10 PM",
                          "6:35 PM", "10:25 PM", "12:50 PM", "4:10 PM", "7:30 PM", "10:40 PM" };
          
                  List<String> timeList = Arrays.asList(timeStrArr);
          
                  DateTimeFormatter timeFormat = new DateTimeFormatterBuilder()
                                                  .parseCaseInsensitive()
                                                  .appendPattern("h:m a")
                                                  .toFormatter(Locale.ENGLISH);
          
                  Collections.sort(timeList, new Comparator<String>() {
                      public int compare(String s1, String s2) {
                          return LocalTime.parse(s1, timeFormat).compareTo(LocalTime.parse(s2, timeFormat));
                      }
                  });
          
                  System.out.println(timeList);
                  System.out.println("Earliest time in the list: " + timeList.get(0));
              }
          }
          

          通过 Trail: Date Time 了解有关现代日期时间 API 的更多信息。


          * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个Android项目工作并且您的Android API级别仍然不符合Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

          【讨论】:

          • 谢谢 Arvind,你能解释一下第 22 和 24 行吗?
          • 如果能改成非 Lambda 表达式就好了,我对 Lambda 表达式不太熟悉。
          猜你喜欢
          • 1970-01-01
          • 2019-03-14
          • 1970-01-01
          • 2019-08-01
          • 1970-01-01
          • 2021-12-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多