使用字符串日期排序列表

时间:2013-03-17 15:54:45

标签: android

我有一个小问题。我有一个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值。我该如何排序这个清单?帮助我,因为我不知道我该怎么做。

5 个答案:

答案 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))次。

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

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

  2. 如果您希望获得更快的速度,可以使用Radix sort(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)复杂的数据。