如何在java中对列表中的最早时间戳进行排序?

如何在java中对列表中的最早时间戳进行排序?,java,list,time,java-time,datetime-parsing,Java,List,Time,Java Time,Datetime Parsing,预期结果显示第0个索引中最早的上午11:45 我已尝试将上述列表转换为整数,当特定时间(12:35 PM)中存在唯一时间(AM/PM)时,我可以对其进行排序,但当特定时间(12:35 PM,12:05 PM)中存在多个时间戳时,我无法进行排序。一个问题是,类似4 PM的时间将在列表中显示为4.0,因此,前面的时间类似于11:45am(显示为11.45)。我建议看一看java.util.Date和friends之类的类,找到一个函数,它可以将这些时间转换为另一种格式,如午夜后的秒数或24小时表示法

预期结果显示第0个索引中最早的上午11:45


我已尝试将上述列表转换为整数,当特定时间(12:35 PM)中存在唯一时间(AM/PM)时,我可以对其进行排序,但当特定时间(12:35 PM,12:05 PM)中存在多个时间戳时,我无法进行排序。

一个问题是,类似
4 PM
的时间将在列表中显示为4.0,因此,前面的时间类似于
11:45am
(显示为11.45)。我建议看一看java.util.Date和friends之类的类,找到一个函数,它可以将这些时间转换为另一种格式,如午夜后的秒数或24小时表示法,然后按这种格式排序。

最简单的解决方案之一是对下面的代码进行修改:

  • 分拣前将12:mm AM/PM转换为00:mm AM/PM
  • 将hh:mm AM转换为hh.mm,将hh:mm转换为(hh+12).mm
  • 对列表排序
  • 将hh.mm转换为hh:mm AM/PM

    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]
    
    结果是:

    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";
    
    更高效的代码将在稍后的编辑中出现。

    java.time 我建议您使用*

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

    import java.time.LocalTime;
    导入java.time.format.DateTimeFormatter;
    导入java.time.format.DateTimeFormatterBuilder;
    导入java.util.array;
    导入java.util.Collections;
    导入java.util.Comparator;
    导入java.util.List;
    导入java.util.Locale;
    公共班机{
    公共静态void main(字符串参数[]){
    字符串[]timeStrArr={“12:40 PM”,“4:00 PM”,“7:20 PM”,“10:40 PM”,“12:00 PM”,“3:25 PM”,“6:50 PM”,
    “晚上10:15”,“下午6:35”,“晚上9:50”,“下午12:20”,“下午3:45”,“晚上7:15”,“晚上10:40”,“上午11:45”,“下午3:10”,
    ‘下午六时三十五分’、‘十时二十五分’、‘十二时五十分’、‘四时十分’、‘七时三十分’、‘十时四十分’;
    List timeList=Arrays.asList(timeStrArr);
    DateTimeFormatter timeFormat=新的DateTimeFormatterBuilder()
    .parseCase不敏感()
    .追加模式(“h:m a”)
    .toFormatter(Locale.ENGLISH);
    Collections.sort(timeList,newcomparator(){
    公共整数比较(字符串s1、字符串s2){
    返回LocalTime.parse(s1,timeFormat.compareTo(LocalTime.parse(s2,timeFormat));
    }
    });
    System.out.println(时间列表);
    System.out.println(“列表中的最早时间:“+timeList.get(0));
    }
    }
    
    了解有关现代日期时间API的更多信息


    *无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。
    尝试使用此代码。它很紧凑。使用Java8定义一个比较器,该比较器将完成排序时间的工作。 `

    String arg[]=a.split(“,”);
    Listal=newarraylist();
    al=数组.asList(arg);
    Collections.sort(al,(x,y)->{
    int结果;
    字符串[]splitx=x.trim().split(\\s+);
    字符串[]splity=y.trim().split(\\s+);
    if(splitx[1].equals(“AM”)和&splity[1].equals(“PM”)){
    结果=-1;
    }else if(splitx[1].equals(“PM”)和&splity[1].equals(“AM”)){
    结果=1;
    }否则{
    结果=x。与(y)相比;
    }
    返回结果;
    });
    系统输出打印项次(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,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:50 PM,7:30 PM,9:50 PM,12:40 PM]
    

    希望它能解决您的问题。

    谢谢Arvind,您能给我解释一下第22行和第24行吗。如果您能将它改成非Lambda表达式,那就太好了,我对Lambda表达式不太熟悉。
    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]
    
    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
    
    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));
        }
    }
    
      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);