我有一个小问题。我有一个ArrayList listOfSData,其中每个元素都像日期一样:例如:
[30-03-2012,28-03-2013,31-03-2012,2-04-2012,...]
现在我想知道如何对此列表进行排序。我的意思是我想对此进行排序
[28-03-2013,30-03-2012,31-03-2012,2-04-2012,等]。
此列表必须具有String值。我该如何排序这个清单?帮助我,因为我不知道我该怎么做。
答案 0 :(得分:24)
您需要实现一个Comparator<String>
对象,在比较它们之前将字符串转换为日期。 SimpleDateFormat
对象可用于执行转换。
类似的东西:
class StringDateComparator implements Comparator<String>
{
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
public int compare(String lhs, String rhs)
{
return dateFormat.parse(lhs).compareTo(dateFormat.parse(rhs));
}
}
Collections.sort(arrayList, new StringDateComparator());
答案 1 :(得分:7)
这是一个基于您输入的小例子。这可以用几行来完成,但我认为这样会更好理解。希望它有所帮助。
List<String> values = new ArrayList<String>();
values.add("30-03-2012");
values.add("28-03-2013");
values.add("31-03-2012");
Collections.sort(values, new Comparator<String>() {
@Override
public int compare(String arg0, String arg1) {
SimpleDateFormat format = new SimpleDateFormat(
"dd-MM-yyyy");
int compareResult = 0;
try {
Date arg0Date = format.parse(arg0);
Date arg1Date = format.parse(arg1);
compareResult = arg0Date.compareTo(arg1Date);
} catch (ParseException e) {
e.printStackTrace();
compareResult = arg0.compareTo(arg1);
}
return compareResult;
}
});
答案 2 :(得分:0)
这是我用于按时间参数排序对象数组的方法。通过每次比较2个字符串时间来完成,通过将模式参数更改为:“dd-MM-yyyy”
,可以轻松调整日期比较int repositorySize = tempTasksRepository.size();
int initialRepositorySize = repositorySize;
Task soonTask = tempTasksRepository.get(0);
String pattern = "HH:mm";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
for (int i= 0; i < initialRepositorySize; i++)
{
for (int j= 0; j < repositorySize; j++)
{
Task tempTask = tempTasksRepository.get(j);
try
{
Date taskTime = simpleDateFormat.parse(tempTask.getTime());
Date soonTaskTime = simpleDateFormat.parse(soonTask.getTime());
// Outputs -1 as date1 is before date2
if (taskTime.compareTo(soonTaskTime) == -1)
{
soonTask = tempTask;
}
}
catch (ParseException e)
{
Log.e(TAG, "error while parsing time in time sort: " + e.toString());
}
}
tasksRepository.add(soonTask);
tempTasksRepository.remove(soonTask);
if ( tempTasksRepository.size() > 0 )
{
soonTask = tempTasksRepository.get(0);
}
repositorySize--;
答案 3 :(得分:0)
尝试将SimpleDateFormat与“d-MM-yyyy”模式一起使用: 1.创建SimpleDateFormat 2.将listOfSData字符串数组解析为java.util.Date [] 3.使用Arrays.sort对日期数组进行排序 4.使用相同的SimpleDateFormat
将Date []转换为字符串数组答案 4 :(得分:0)
起初已经给出了答案,但是这些决定并不是很快。
标准java Collections.sort使用timsort。在一般情况下,它需要进行O(n * log(n))比较,因此您的自定义比较器将调用O(n * log(n))次。
如果性能对您很重要,例如,如果您有大型数组,则可以执行以下操作:
将字符串日期转换为int或long时间戳。这需要O(n)操作。然后你只需对long或整数排序。两个原子int的比较比任何比较器快得多。
如果您希望获得更快的速度,可以使用Radix sort(http://en.wikipedia.org/wiki/Radix_sort)。我需要很多记忆,但我们可以优化它。我认为你不需要指定时间。所以价值范围不是很大。 在第一次传递(O(n))时,您可以将日期转换为整数值,并使用下一个假设: