如何排序java中列表中最早的时间戳?

How to sort the earliest time stamp in the list in java?

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。

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

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

对您来说最简单的解决方案之一是下面的代码,只需对您的代码进行少量更改即可:

  • 在排序前将 12:mm AM/PM 转换为 00:mm AM/PM
  • 将hh:mm AM 转换为hh.mm,将hh:mm 转换为(hh+12).mm
  • 对列表进行排序
  • 将hh.mm转换为hh:mmAM/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]

更高效的代码将在以后的编辑中出现。

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在评论部分要求)

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 which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and

尝试使用此代码。它很紧凑。使用 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] 希望它能解决您的问题。