如何按日期对数组进行排序?
问题描述:
在我的Android应用程序中,我试图获得一个有序数组。我有一个具有名称字符串和日期字符串的数组数组。我试图根据日期对名称进行排序。是这样的:如何按日期对数组进行排序?
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;
}
}
我会把它想输出按日期和时间排序一样的名字:
namesList = {name4, name3, name2, name1, name5}
我不知道如何做到这一点。
答
你应该解析字符串转换成日期,然后进行比较,为Android可以使用Arrays.sort方法并传递一个匿名比较
例子:
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));
}
答
java.time
accepted answer是正确的,但使用过时的类作为问题。 java.util.Date
类被嵌入到Java 8及更高版本中的java.time框架所取代。这些课程取代了旧的麻烦日期时间课程,如java.util.Date
。见Oracle Tutorial。许多功能已被移植到ThreeTen-Backport中的Java中,并进一步适用于Android中的ThreeTenABP。
使用java.util.Date
类的代码意味着数据输入在UTC时区。但是我们不能仅仅根据给定的数据做出这样的假设。所以更合适的是LocalDateTime
类别故意缺少任何offset-from-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);
该答案中的其他逻辑保持不变。 LocalDateTime
类实现compareTo
。
对于初学者,您正在尝试做2件事。对数组进行排序,并从子数组中提取一个信息。 – njzk2
而那不可能?在一个总监?因为那不是比较者所做的事情,所以我总是可以在排序之后提取姓名 – Mischa
。你需要先排序,然后提取你需要的值 – njzk2