【问题标题】:Sort an ArrayList base on multiple attributes根据多个属性对 ArrayList 进行排序
【发布时间】:2011-05-17 15:17:59
【问题描述】:

我有一个对象的 ArrayList。该对象包含属性datevalue。所以我想在date 上对对象进行排序,对于同一日期的所有对象,我想在value 上对它们进行排序。我该怎么做?

【问题讨论】:

    标签: java sorting


    【解决方案1】:

    实现自定义Comparator,然后使用Collections.sort(List, Comparator)。它可能看起来像这样:

    public class FooComparator implements Comparator<Foo> {
        public int compare(Foo a, Foo b) {
            int dateComparison = a.date.compareTo(b.date);
            return dateComparison == 0 ? a.value.compareTo(b.value) : dateComparison;
        }
    }
    
    Collections.sort(foos, new FooComparator());
    

    【讨论】:

      【解决方案2】:
      public static <T> void sort(List<T> list, final List<Comparator<T>> comparatorList) {  
             if (comparatorList.isEmpty()) {//Always equals, if no Comparator.  
                  throw new IllegalArgumentException("comparatorList is empty.");  
             }  
             Comparator<T> comparator = new Comparator<T>() {  
             public int compare(T o1, T o2) {  
                     for (Comparator<T> c:comparatorList) {  
                         if (c.compare(o1, o2) > 0) {  
                           return 1;  
                         } else if (c.compare(o1, o2) < 0) {  
                           return -1;  
                         }  
                     }  
                     return 0;  
               }  
             };  
             Collections.sort(list, comparator);  
        } 
      

      【讨论】:

      【解决方案3】:

      如果你想要示例代码看起来像,你可以使用以下:

      Collections.sort(foos, new Comparator<Foo>{
          public int compare(Foo a, Foo b) {
              int dateComparison = a.date.compareTo(b.date);
              return dateComparison == 0 ? a.value.compareTo(b.value) : dateComparison;
          }
      });
      

      【讨论】:

        【解决方案4】:

        使用Stream API的Java-8解决方案:

        List<Foo> sorted = list.stream()
                                .sorted(Comparator.comparing(Foo::getDate)
                                                .thenComparing(Foo::getValue))
                                .collect(Collectors.toList());
        

        如果你想对原来的list本身进行排序:

        list.sort(Comparator.comparing(Foo::getDate)
                            .thenComparing(Foo::getValue)); 
        

        【讨论】:

          【解决方案5】:

          如果对象的类实现了 Comparable,那么您只需正确编码 compareTo 方法以首先比较日期,然后如果日期相等,则比较值,然后根据结果返回适当的 int 结果.

          【讨论】:

          • 或者,如果您不想让类实现 Comparable...,您可以使用上面提到的 Comparator 来执行此操作....您的选择。如果您使用比较器,那么比较方法将利用我上面的建议。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-06
          • 1970-01-01
          • 2017-02-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多