【问题标题】:Sorting Arraylist of Custom object by creation date按创建日期对自定义对象的 Arraylist 进行排序
【发布时间】:2012-02-06 01:35:07
【问题描述】:

我有一个自定义对象,其结构是

public String name;
public int type;
public String createdOn;

createdOn是日期,格式是:2011-12-16T23:27:27+0000

我在ArrayList 中存储了多个这种类型的对象,现在我想根据那里的创建日期和时间对它们进行排序。

我尝试过使用Collections.sort(....),但没有合适的结果。

【问题讨论】:

  • 向我们展示您的尝试,并解释为什么您将日期存储为字符串而不是将它们存储为日期。
  • 你能展示一下你已经尝试过的东西吗..
  • 将日期用作日期而不是字符串或更好,修改您的对象并添加另一个值(如果可能从数据/时间派生),您可以在其上执行排序

标签: java datetime sorting arraylist custom-object


【解决方案1】:

对于自定义对象,您需要自定义比较器,或者您需要使类具有可比性。

您可以每次都转换日期字符串,也可以只比较字符串(前提是时区不变)

正如建议的那样,将日期存储为 Date 或 long 可能是更好的选择。

【讨论】:

    【解决方案2】:

    您是否尝试过实现您的自定义 Comparator

    new Comparator<CustomObject>() {
        public int compare(CustomObject o1, CustomObject o2) {
           //compare by date 
           return <-1 or 0 or 1>;
        }
    }
    

    【讨论】:

      【解决方案3】:

      你必须使用Collections.sort(List&lt;T&gt; list, Comparator&lt;? super T&gt; c) 并实现一个比较器,比如

      Comparator c = new Comparator<YourObject>() {
          public int compare(YourObject o1, YourObject o2) {
             return o1.createdOn.compareTo(o2.createdOn);
          }
      }
      

      【讨论】:

        【解决方案4】:

        您需要创建自己的自定义Comparator(查看here)。您很可能必须将字符串解析回日期。查看 this 之前的 SO 帖子,了解如何比较日期。

        【讨论】:

          【解决方案5】:

          你的类应该实现接口Comparable。在这种情况下,您可以根据需要实现compareTo() 方法。

          您也可以实现自定义比较器:

          class MyCreationDateComparator implements Comparator<MyClass> {
              public int compare(MyClass o1, MyClass o2) {
                  // implement your logic here.
              } 
          }
          

          现在使用接受自定义比较器的Collections.sort() 版本。如果您的比较器很简单,您可以使用匿名内部类。

          【讨论】:

            【解决方案6】:

            按照here 的说明,只需使用 Date 类中的方法来比较日期

            【讨论】:

              【解决方案7】:

              您应该在自定义对象中使用Comparator 或实现Comparable

              实现 Comparable 可以为对象定义自然顺序。在Comparable.compareTo() 方法中,您必须将当前对象与另一个对象进行比较并返回

              • 如果当前对象“小于”另一个对象,则为负整数;
              • 如果当前对象与另一个对象“相等”,则为零;
              • 如果当前对象“大于”另一个对象,则为正整数。

              一个例子:

              public class CustomObject implements Comparable<CustomObject> {
              
                  @Override
                  public int compareTo(CustomObject otherOne) {
                      // Compare the current object with the otherOne and return an
                      // appropriate integer
                      return 0;
                  }
              
              }
              
              // To sort
              
              Collections.sort(listOfCustomObjects);
              

              另一方面,实现一个比较器,您可以在自定义对象的代码之外指定一个排序标准。使用适当的Collections.sort() 方法,您可以指定集合中对象的顺序。 Comparator.compare() 方法遵循上述相同的规则。

              一个例子:

              public class CustomObjectComparator implements Comparator<CustomObject> {
              
                  @Override
                  public int compare(CustomObject a, CustomObject b) {
                      // Compare a with b and return an appropriate integer
                      return 0;
                  }
              
              }
              
              // To sort
              
              Collections.sort(list, new CustomObjectComparator());
              

              【讨论】:

                【解决方案8】:

                得到答案后做了一些研发,我解决了排序的问题,这里是按日期排序数组列表的代码。

                Collections.sort(arrlst,new Comparator<T>() {
                
                                    public int compare(T lhs, T rhs) {
                
                                        try {
                                            SimpleDateFormat dateFormatlhs = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
                                            Date convertedDatelhs = dateFormatlhs.parse(lhs.feedCreatedTime);
                                            Calendar calendarlhs = Calendar.getInstance();
                                            calendarlhs.setTime(convertedDatelhs);
                
                                            SimpleDateFormat dateFormatrhs = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
                                            Date convertedDaterhs = dateFormatrhs.parse(rhs.feedCreatedTime);
                                            Calendar calendarrhs = Calendar.getInstance();
                                            calendarrhs.setTime(convertedDaterhs);
                
                                            if(calendarlhs.getTimeInMillis() > calendarrhs.getTimeInMillis())
                                            {   
                
                
                                                return -1;
                                            }
                                            else
                                            {
                
                
                                                return 1;
                
                                            }
                                        } catch (ParseException e) {
                
                                            e.printStackTrace();
                                        }
                
                
                                        return 0;
                                    }
                                });
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-02-16
                  相关资源
                  最近更新 更多