【问题标题】:Sorting Arraylist of Arraylist of Bean排序 Arraylist of Arraylist of Bean
【发布时间】:2012-10-31 08:43:54
【问题描述】:

我有一个 ArrayListArrayList 的 Bean,我需要根据 Bean 中的 date 变量对这个 ArrayList 进行排序。

ArrayList<ArrayList<DriverLogDatePair>> driverLogList

DriverLogDatePair bean 有一个变量DateTime date,它也有一个compareTo 方法。

public int compareTo(DriverLogDatePair o) {
    return date.compareTo(o.date);
}

但我无法对driverLogList 进行排序。

【问题讨论】:

  • 您要排序哪个ArrayList,内部还是外部?您有一个列表列表,并且想要对内部列表中的日期元素进行排序,所以我假设您想要对内部列表进行排序 - 还是什么?
  • ArrayList 将如何排序?您也需要为此提供比较器。
  • 您想对所有单独的列表进行排序吗?或者你想对全局列表进行排序(所以改变ArrayList&lt;DriverLogDatePair&gt;的顺序?如果是第二个,你想使用什么标准?
  • 我需要根据bean日期值对外面的进行排序。
  • 您需要编写您的自定义comparator 并将其与Collection.sort(list,newcomparator) 方法一起使用

标签: java sorting collections


【解决方案1】:

您必须完成此代码:

ArrayList<ArrayList<DriverLogDatePair>> driverLogList = new ArrayList<>();
Collections.sort( driverLogList, new Comparator<ArrayList<DriverLogDatePair>>(){
   @Override public int compare(
      ArrayList<DriverLogDatePair> left,
      ArrayList<DriverLogDatePair> right )
   {
      return 0;
   }});

因为第一个数组包含一个包含 Comparable 的数组。 您提供的比较器适用于 DriverLogDatePair 而不是 ArrayList

(...在这篇文章的cmets之后...)

根据您的要求,我建议完成比较器:

int size = left.size();
int diff = size - right.size();
if( diff != 0 ) return diff;
for( int i = 0; i < size; ++i ) {
   diff = left.get( i ).compareTo( right.get(i) );
   if( diff != 0 ) return diff;
}

但我不知道这种比较的真正含义。 这是一个语义问题,这真的是你想要的吗?

【讨论】:

  • 欧宾你能告诉我我需要在里面放什么吗?我的意思是我将如何在其中进行比较。
  • Aubin 我使用了你的代码并添加了 for(int i=0;i
【解决方案2】:

问题在于,如果您对driverLogList 进行排序,它会尝试比较包含的ArrayList 对象。我会为该列表编写一个包装器:

public class DriverLogDatePairList extends ArrayList<DriverLogDatePair> implements Comparable<DriverLogDatePairList> {

    public int compareTo(DriverLogDatePairList o) {
        //your comparison criteria
    }
}

那你就可以这样使用并排序了:

ArrayList<DriverLogDatePairList> driverLogList;

【讨论】:

    【解决方案3】:

    一般情况下,你可以使用Lists 排序

    Collections.sort( list , comparator )
    

    因此,假设您要对内部列表进行排序,在实现了合适的比较器之后,遍历外部列表并使用该构造对元素进行排序:

    Comparator comparator = 
        new Comparator<DateTime>()
        {
            @Override
            public int compare( DateTime o1, DateTime o2 )
            {
                return o1.compareTo( o2 );
            }
        }
    

    干杯,

    【讨论】:

      【解决方案4】:

      您的比较方法对我来说似乎是错误的..

      应该是这样的: (这里我假设日期为 DriverLogDatePair 对象)

      public int compareTo(DriverLogDatePair o) {
          if(date.date < o.date) return -1;
          else if (date.date < o.date) return 0;
          else return 1;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-02-13
        • 2023-04-05
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-24
        • 2017-02-19
        • 1970-01-01
        • 2014-09-16
        相关资源
        最近更新 更多