2010-11-30 9 views
15

私はオブジェクトのArrayListを持っています。オブジェクトには、属性datevalueが含まれています。だから私はdate上のオブジェクトを並べ替えると、同じ日付にすべてのオブジェクトについては、valueでそれらを並べ替えるしたいと思います。どうやってやるの?複数の属性にArrayListベースをソート

答えて

20

カスタム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

[値]が... 'Comparable'を実装し、いくつかのクラスである – harto

0

オブジェクトのクラスがComparableを実装する場合は、あなたがする必要があるすべてが適切に最初の日付を比較するcompareToメソッドをコーディングされ、日付が等しい場合、その後、値を比較しますその結果に基づいて適切なint結果を返します。

+0

それとも、コンパレータでこれを行うことができます'と仮定上記のように、クラスをComparable ....を実装するようにしたくない場合は、選択します。コンパレータを使用する場合、compareメソッドは上記の私の提案を利用します。 –

1

したい場合は、以下を使用することができ、同様にサンプルコードが見えます:

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; 
    } 
}); 
3
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); 
    } 
+0

Guavaの 'Ordering'クラスを参照してください:http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect /Ordering.html –

関連する問題