【问题标题】:Sort list with string dates使用字符串日期排序列表
【发布时间】:2013-03-17 15:54:44
【问题描述】:

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

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

【问题讨论】:

标签: android


【解决方案1】:

您需要实现一个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());

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 服务很好,提供代码! ;) 不过实话说。在我看来,关于 sortig Collection 对象的概念的几句话会很棒。
    【解决方案3】:

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

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

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

    1. 将字符串日期转换为 int 或 long 时间戳。这需要 O(n) 操作。然后你只需对长整数或整数数组进行排序。两个 atomic 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)。

    【讨论】:

      【解决方案4】:

      这是我编写的一种方法,用于按时间参数对对象数组进行排序。这是通过每次比较 2 个字符串时间来完成的,这可以通过将模式参数更改为:“dd-MM-yyyy”来轻松调整您的日期比较:“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--;
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-30
          • 1970-01-01
          • 2016-04-04
          • 2018-07-07
          • 2013-01-18
          • 2020-10-01
          • 2015-04-14
          相关资源
          最近更新 更多