我有一个小问题。我有一个 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 等]。
此列表必须具有字符串值。我怎样才能对这个列表进行排序?帮助我,因为我不知道该怎么做。
我有一个小问题。我有一个 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 等]。
此列表必须具有字符串值。我怎样才能对这个列表进行排序?帮助我,因为我不知道该怎么做。
在比较它们之前,您需要实现一个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());
这是一个基于您输入的小示例。这可以用少几行来完成,但我认为这会更好理解。希望能帮助到你。
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;
}
});
起初已经给出的答案是写的,但他们的决定不是很快。
标准 java Collections.sort 使用 timsort。在平均情况下,它需要 O(n*log(n)) 比较,因此您的自定义比较器将调用 O(n*log(n)) 次。
如果性能对您很重要,例如,如果您有大型阵列,您可以执行以下操作:
将字符串日期转换为 int 或 long 时间戳。这需要 O(n) 操作。然后你只需对长整数或整数数组进行排序。两个原子 int 的比较比任何比较器都要快得多。
如果您想为这种排序获得更快的速度,可以使用基数排序(http://en.wikipedia.org/wiki/Radix_sort)。我占用了很多内存,但我们可以优化它。如我所见,您不需要指定一天中的时间。所以取值范围不是很大。在第一次通过 (O(n)) 时,您可以将日期转换为整数值,并有以下假设:
这是我编写的一种方法,用于按时间参数对对象数组进行排序。它是通过每次比较 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--;
尝试将SimpleDateFormat与“d-MM-yyyy”模式一起使用: 1. 创建 SimpleDateFormat 2. 将 listOfSData 字符串数组解析为 java.util.Date[] 3. 使用 Arrays.sort 对日期数组进行排序 4. 将 Date[] 转换为字符串数组使用相同的 SimpleDateFormat