2013-03-17 94 views
1

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

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

+0

http://code.google.com/p/date-sorting-example/source/browse/trunk/date-util-test/src/date/util/test/DateUtil.java? r = 3 – Raghunandan 2013-03-17 15:57:21

回答

14

您将需要实现一个Comparator<String>对象,它在比较它们之前将字符串转换为日期。 A 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()); 
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--; 
0

尝试使用SimpleDateFormat用“d-MM- YYYY”图案: 1.创建的SimpleDateFormat 2. 4.转换日期[]到字符串数组使用相同的SimpleDateFormat

解析listOfSData字符串数组来使用Arrays.sort java.util.Date [] 3.排序日期阵列
5

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

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; 
     } 
    }); 
+0

伟大的服务,提供代码! ;) 不过实话说。正如我所看到的,关于sortig Collection对象概念的几句话会很棒。 – 2013-03-17 16:35:06

+0

它为我工作!谢谢 – 2017-08-28 10:06:24

0

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

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

如果性能对你很重要,例如,如果你有大的数组,你可以下面的事情要做:

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

  2. 如果你想获得更快的速度,你可以使用使用基数排序(http://en.wikipedia.org/wiki/Radix_sort)。我需要很多记忆,但我们可以优化它。正如我所看到的,你不需要指定一天的时间。所以价值的范围不是很大。 在firts通(O(n))的,你可以转换日期为整数值,与未来的假设:

    • 1970年01 01开始日期(或更具体的时间,如果你知道的话)和编码像1
    • 允许最大日期为2170 01 01
    • 全月有31天。所以你每年得到31 * 12 = 372的值 而且你可以用基数排序来排序整数数组。排序200年范围内的值对于合并排序数组只需要200 * 372 * 4 = 297600字节,但是会得到O(2 * n)复杂度。