9

我有一个小问题。我有一个 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 等]。

此列表必须具有字符串值。我怎样才能对这个列表进行排序?帮助我,因为我不知道该怎么做。

4

5 回答 5

35

在比较它们之前,您需要实现一个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());
于 2013-03-17T15:56:20.753 回答
11

这是一个基于您输入的小示例。这可以用少几行来完成,但我认为这会更好理解。希望能帮助到你。

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;
        }
     });
于 2013-03-17T16:13:38.593 回答
2

起初已经给出的答案是写的,但他们的决定不是很快。

标准 java Collections.sort 使用 timsort。在平均情况下,它需要 O(n*log(n)) 比较,因此您的自定义比较器将调用 O(n*log(n)) 次。

如果性能对您很重要,例如,如果您有大型阵列,您可以执行以下操作:

  1. 将字符串日期转换为 int 或 long 时间戳。这需要 O(n) 操作。然后你只需对长整数或整数数组进行排序。两个原子 int 的比较比任何比较器都要快得多。

  2. 如果您想为这种排序获得更快的速度,可以使用基数排序(http://en.wikipedia.org/wiki/Radix_sort)。我占用了很多内存,但我们可以优化它。如我所见,您不需要指定一天中的时间。所以取值范围不是很大。在第一次通过 (O(n)) 时,您可以将日期转换为整数值,并有以下假设:

    • 1970 01 01 是开始日期(或者更具体的时间,如果你知道的话)并且编码像 1
    • 让最大日期为 2170 01 01
    • 整个月有 31 天。所以你每年得到 31*12 = 372 个值而且你可以使用基数排序对整数数组进行排序。对于合并排序数组,对具有 200 年范围的值进行排序仅需要 200 * 372 * 4 = 297600 个字节,但您会得到 O(2 * n) 复杂度。
于 2013-03-17T16:47:40.500 回答
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--;
于 2013-03-17T16:00:09.487 回答
0

尝试将SimpleDateFormat与“d-MM-yyyy”模式一起使用: 1. 创建 SimpleDateFormat 2. 将 listOfSData 字符串数组解析为 java.util.Date[] 3. 使用 Arrays.sort 对日期数组进行排序 4. 将 Date[] 转换为字符串数组使用相同的 SimpleDateFormat

于 2013-03-17T16:00:42.450 回答