简体   繁体   English

如何按日期对数组进行排序?

[英]How to sort an array of arrays by date?

In my android app I'm trying to get a sorted array. 在我的Android应用程序中,我试图获取一个排序数组。 I've got an array of arrays with a name string and a date string. 我有一个带有名称字符串和日期字符串的数组数组。 I'm trying to sort the names based on the dates. 我正在尝试根据日期对名称进行排序。 something like this: 像这样的东西:

private void sortList() {
    String[][] namesAndDatesList = new String[][] {
                new String[] {"name1", "05/03/2016 02:11:33")}
            ,   new String[] {"name2", "04/03/2016 02:11:34"}
            ,   new String[] {"name3", "04/03/2016 02:11:33")}
            ,   new String[] {"name4", "02/03/2016 02:11:33")}
            ,   new String[] {"name5", "05/03/2016 02:11:38")}
    };

    String[] namesList = Collections.sort(namesAndDatesList, new StringDateComparator());

}

class StringDateComparator implements Comparator<String>
{
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
    public int compare(params)
    {
        try {
            // return something
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0;
    }
}

I would like it to output the names sorted by date and time like: 我希望它输出按日期和时间排序的名称,例如:

namesList = {name4, name3, name2, name1, name5}

I'm not sure how to do this. 我不确定该怎么做。

You should parse the string into a date and then compare it, for android you can use Arrays.sort method and pass an anonymous comparator 您应该将字符串解析为一个日期,然后进行比较,对于android,您可以使用Arrays.sort方法并传递一个匿名比较器

Example: 例:

private void sort2dArray() {
String[][] namesAndDatesList = new String[][] { new String[] { "name1", "05/03/2016 02:11:33" },
    new String[] { "name2", "04/03/2016 02:11:34" }, new String[] { "name3", "04/03/2016 02:11:33" },
    new String[] { "name4", "02/03/2016 02:11:33" }, new String[] { "name5", "05/03/2016 02:11:38" } };

Arrays.sort(namesAndDatesList, new Comparator<String[]>() {

    @Override
    public int compare(String[] o1, String[] o2) {

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    Date d1 = null;
    Date d2 = null;
    try {
        d1 = sdf.parse(o1[1]);
        d2 = sdf.parse(o2[1]);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return d1.compareTo(d2);
    }
});
System.out.println(Arrays.deepToString(namesAndDatesList));
}

This seems to be what you're looking for: java Arrays.sort 2d array 这似乎是您在寻找的内容: java Arrays.sort 2d array

Alternatively, you could create a custom class with two properties (name, date), then create a CustomClassComparator which implements Comparator. 另外,您可以创建具有两个属性(名称,日期)的自定义类,然后创建实现Comparator的CustomClassComparator。

java.time java.time

The accepted answer is correct but uses outdated classes as doe the Question. 接受的答案是正确的,但是使用过时的类作为问题。 The java.util.Date class is supplanted by the java.time framework built into Java 8 and later. Java 8及更高版本中内置的java.time框架取代了java.util.Date类。 These classes supplant the old troublesome date-time classes such as java.util.Date . 这些类取代了旧的麻烦的日期时间类,例如java.util.Date See Oracle Tutorial . 请参见Oracle教程 Much of the functionality has been back-ported to Java 6 & 7 in ThreeTen-Backport and further adapted to Android in ThreeTenABP . 许多功能已被后移植到Java 6和7在ThreeTen-反向移植并且还适于在到Android ThreeTenABP

The code using java.util.Date class implies that the data inputs are in UTC time zone. 使用java.util.Date类的代码表示数据输入位于UTC时区。 But we cannot make that assumption from the given data alone. 但是我们不能仅根据给定的数据做出该假设。 So more appropriate is the LocalDateTime class which purposely lacks any offset-from-UTC or time zone info. 因此,更合适的是LocalDateTime类,该类故意缺少与UTC的偏移量或时区信息。

String input = "04/03/2016 02:11:34";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd/MM/yyyy HH:mm:ss" );
LocalDateTime ldt = LocalDateTime.parse( input , formatter );

The rest of the logic in that Answer remains the same. 该答案中的其余逻辑保持不变。 The LocalDateTime class implements compareTo . LocalDateTime类实现compareTo

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM