【问题标题】:Sorting an arraylist of objects by date using SS::MM::HH MM/DD/YY/ format使用 SS::MM::HH MM/DD/YY/ 格式按日期对对象数组列表进行排序
【发布时间】:2010-02-12 08:21:37
【问题描述】:

我有一个对象数组列表,每个对象都包含以下格式的唯一日期

YEAR-DAY-MONTH HOUR:MINUTE:SECOND (example: 2010-02-10 23:32:14)

我正在尝试将数组列表中的每个对象(有几千个)与我创建的递增计时器类进行比较,以检查两个时间是否匹配。检查对象和计时器是否具有匹配日期的最简单方法似乎是首先将数组列表从最早到最晚排序,然后检查每个对象,一旦匹配到列表中的下一个对象计时器。但是,我不确定如何根据前面提到的时间格式对数组列表进行排序。到目前为止,我过时的对象具有以下属性:

public float min;
public float hour;
public float day;
public float month;
public float year;

如何对这些对象的数组列表进行排序,以便从最早日期到最晚日期排序?

【问题讨论】:

    标签: java date time arraylist


    【解决方案1】:

    1 - 为您的对象创建一个Comparator

    2 - 然后,在这些对象的列表上使用 Collections.sort

    【讨论】:

      【解决方案2】:

      潜在的简单解决方案

      在我看来,您正在重新发明轮子。已经有很多类型代表日期和时间 - 创建自己的类型可能会导致痛苦。 在这种情况下,我建议使用来自Joda TimeLocalDateTime

      回答实际问题

      你提到了一种“格式”,就好像我们真的在处理字符串一样——但我在那里看不到任何关于字符串的东西。

      您为什么使用float 值?这些看起来像是自然整数 - 尽管您也需要秒数。

      你可以让你的类型很容易自然地实现Comparable<T>——然后你只需要调用Collections.sort,它就会做正确的事情。这是Comparable<Foo> 的示例实现,假设您的类型称为Foo

      public int compareTo(Foo other)
      {
          if (other == null)
          {
              throw new NullPointerException();
          }
          if (year < other.year)
          {
              return -1;
          }
          if (year > other.year)
          {
              return 1;
          }
          if (month < other.month)
          {
              return -1;
          }
          if (month > other.month)
          {
              return 1;
          }
          // etc
          // If we haven't returned after comparing everything
          // then the values must be equal
          return 0;
      }
      

      chburd 实施Comparer&lt;T&gt; 的答案同样有效;如果您的对象只是一个日期/时间,那么您就有了自然的排序顺序,Comparable&lt;T&gt; 可能是更好的选择;如果您实际上在对象中有更多属性并且您可能希望按这些属性进行排序,那么Comparer&lt;T&gt; 会更好。

      【讨论】:

        【解决方案3】:

        这可能是一个过于简单的答案,但为什么不直接将值放入 TreeMap 开始呢?

            TreeMap<Date, Date> sortedMap = new TreeMap<Date, Date>();
            List<Date> listOfObjectsToSort = new ArrayList<Date>();
            for (Date theDate : listOfObjectsToSort)
            {
              sortedMap.put(theDate.getTime(), theDate);
            }
            List<Date> sotedList = (List<Date>) sortedMap.values();
        

        树状图可以按时间排序。

        我知道创建列表映射的成本更高,当您可以在数组列表上拥有一个比较器时。

        (现在去喝咖啡,然后再读一遍)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-04
          • 1970-01-01
          • 2017-10-06
          • 1970-01-01
          相关资源
          最近更新 更多