如何按时间戳对 List 中的 String[] 进行排序?

How to sort String[] in List by timestamp?

List<String[]> data = Importer.readCsv("test.csv");

String[] 项如下所示:

  1. 职位:姓名(字符串)
  2. 位置:2017-03-14 18:22:44.149(字符串)

按时间戳降序对列表进行排序的好方法是什么?我在不创建新对象的情况下搜索解决方案。

使用 Collection.sort() 和 Comparator.comparing(),我发现这些在稍后回过头来时很容易阅读:

data.sort(Comparator.comparing((String[] o) -> o[1]).reversed());

您可以在不转换的情况下比较时间戳,因为格式是 "correctly" 对字段进行排序。


如果您限于 Java 7,将会有更多样板文件:

Collections.sort(data, new Comparator<String[]>()
{
    @Override
    public int compare(String[] o1, String[] o2)
    {
        return o2[1].compareTo(o1[1]);
        // return -o1[1].compareTo(o2[1]);
    }
});

请注意,我需要按此顺序比较 o2o1 或否定比较 o1o2 的结果以降序排列数据。这在第一种方法中变得更加明显。

您可以使用自定义 Comparator 获取每个数组中的第二个元素并将其转换为 Timestamp。请注意,比较器的函数不能抛出异常,因此您必须捕获潜在的 ParseException 并处理它:

Function<String[], Date> parser = s -> {
    try {
        return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS").parse(s[1]);
    } catch (ParseException e) {
        return null;
    }
};

list.sort(Comparator.comparing(parser));

嗯,非常感谢你的建议和冲动。 特别感谢 XtremeBaumer! 以下代码也可以完成这项工作:

List<String[]> data = importer.readCsv(context, csvFile);


Collections.sort(data, new Comparator<String[]>() {
    @Override
    public int compare(String[] item1, String[] item2) {

        String dateString1 = item1[1];
        String dateString2 = item2[1];

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

        Date date1 = null;
        Date date2 = null;

        try {
            date1 = format.parse(dateString1);
            date2 = format.parse(dateString2);
        } catch (ParseException e) {
            e.printStackTrace();
            return 0;
        }

        // dateString1 is an earlier date than dateString2
        return date1.compareTo(date2);
    }
});