2016-06-16 6 views
3

複数のComparatorオブジェクトを使用してItemオブジェクトのリストをソートするには、Java 8の方法が必要です。複数のComparator項目のテーブルを並べ替える

アプリケーションは、すべてのユーザー操作でコンパレータを作成します。これは、ComparatorオブジェクトをArrayListに格納します。 1つのComparator Itemでソートすることは可能ですが、複数のComarator項目を同時にソートできるようにする必要があります。

私はリストをソートするために使用するコードのこの行:

tbl.getItems().stream().sorted(groupingComparator); 

変数groupingComparatorは、今私は

ArrayList<Comparator<Item>> 
に格納されている複数のフィールドでソートする必要があるタイプ Comparator<Item>

からです

これはJava 8でも可能ですか?そして、私はこれをどのように実装できますか?そのような単純な

答えて

5

あなたが一緒にチェーン複数のコンパレータに比較インタフェースから利用できるthenComparing(Comparator)メソッドを使用することができます。ストリームを使用してこのような連鎖コンパレータをリストから作成するには、下の例を参照してください。

私たちはソートに使用するドメインクラス:

public static class Order { 
    String customer; 
    String item; 

    public Order(String customer, String item) 
    { 
     this.customer = customer; 
     this.item = item; 
    } 

    public String toString() { 
     return "Customer: " + customer + " Item: " + item; 
    } 
} 

サンプルコード:

public static void main(String... args) throws Throwable 
{ 
    List<Order> orders = new ArrayList<>(); 
    orders.add(new Order("A", "Item 1")); 
    orders.add(new Order("B", "Item 3")); 
    orders.add(new Order("A", "Item 2")); 
    orders.add(new Order("B", "Item 1")); 

    List<Comparator<Order>> comparators = 
     Arrays.asList((o1, o2) -> o1.customer.compareTo(o2.customer), // comparator for customer names 
         (o1, o2) -> o1.item.compareTo(o2.item));  // comparator for item names 

    Comparator<Order> comp = 
     comparators.stream() 
        .reduce(Comparator::thenComparing) 
        // use a default comparator if the comparator list was empty 
        .orElse(Comparator.comparing(Object::toString)); 

    orders.stream().sorted(comp).forEach((order) -> System.out.println(order)); 
} 

このコードは、項目名で、その後お客様が最初にソートされた注文を印刷します。

2

public class CompositeComparator implements Comparator<Item> { 
    private List<Comparator<Item>> comparators; 

    public CompositeComparator(List<Comparator<Item>> comparators) { 
     this.comparators = comparators; 
    } 

    @Override 
    public int compare(Item o1, Item o2) { 
     int result = 0; 
     for (Comparator<Item> c : comparators) { 
      result = c.compare(o1, o2); 
      if (result != 0) { 
       break; 
      } 
     } 
     return result; 
    } 
} 
関連する問題