
Java apache commons CompareToBuilder サンプルプログラム
CompareToBuilderの説明(google翻訳)
Comparable.compareTo(Object)メソッドの実装を支援します。
EqualsBuilderとHashCodeBuilderで構築されたequals(Object)とhashcode()と一貫しています。equals(Object)を使用してequalを比較する2つのオブジェクトは通常、compareTo(Object)を使用してequalも比較する必要があります。
関連するすべてのフィールドは、比較の計算に含める必要があります。派生フィールドは無視されます。同じフィールドは、compareTo(Object)とequals(Object)の両方で同じ順序で使用する必要があります。
このクラスの書き込みコードを使用するには、次のようにします。
public MyClass {
String field1;
int field2;
boolean field3;…
public int compareTo(Object o){
MyClass myClass = (MyClass) o;
return new CompareToBuilder()
.appendSuper(super.compareTo(o)
.append(this.field1、myClass.field1)
.append(this.field2、myClass.field2)
.append(this.field3、myClass.field3)
.toComparison();
}
}値はビルダーに追加された順に比較されます。いずれかの比較が0以外の結果を返す場合、その値はtoComparison()によって返された結果になり、その後のすべての比較はスキップされます。
あるいは、リフレクションを使用して追加するフィールドを決定するreflectionCompareメソッドがあります。フィールドはプライベートにできるため、reflectionCompareはAccessibleObject.setAccessible(boolean)を使用して通常のアクセス制御チェックをバイパスします。適切な権限が正しく設定されていない限り、セキュリティマネージャの下では失敗します。明示的に追加するよりも遅くなります。
reflectionCompareを使ったcompareTo(Object)の典型的な実装は以下のようになります:
public int compareTo(Object o){
return CompareToBuilder.reflectionCompare(this、o);
}リフレクションメソッドは、Class.getDeclaredFields()が返す順序でオブジェクトフィールドを比較します。クラスのフィールドが最初に比較され、続いて親クラスのフィールド(クラス階層の下から上の順に)が比較されます。
compareToはソート時に利用すると思います。
Collections, Arraysにそれぞれあるsortメソッドの引数で2番目に入れるものです。
昇順の場合は特に気にしないですが、順番を変える際などに利用します。
また、値がObjectの場合は、それぞれどのようにソートするのかを決定します。
今回は、java.util.Comparatorを利用してソートする場合で、ItemOrderというクラスをソートするサンプルを作成しました。
商品名 降順、ID 降順で処理する場合の、通常の実装とCompareToBuilderを比較しています。
CompareToBuilder
package jp.pjin.tech.java; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import jp.pjin.tech.java.domain.ItemOrder; import org.apache.commons.lang3.builder.CompareToBuilder; public class CommonsExample14 { public static void main(String[] args) throws Exception { List<ItemOrder> orders = Arrays.asList( new ItemOrder(1, "大山", "リンゴ", 150, 12), new ItemOrder(2, "田中", "みかん", 70, 30), new ItemOrder(3, "中村", "みかん", 70, 20), new ItemOrder(4, "村山", "リンゴ", 150, 10), new ItemOrder(5, "山大", "みかん", 70, 35) ); Collections.sort(orders, new Comparator<ItemOrder>() { @Override public int compare(ItemOrder o1, ItemOrder o2) { int compare = o2.getItem().compareTo(o1.getItem()); if (compare == 0) { compare = o2.getId() - o1.getId(); } return compare; } }); orders.forEach(System.out::println); System.out.println("--------"); Collections.sort(orders, (ItemOrder o1, ItemOrder o2) -> { return new CompareToBuilder() .append(o2.getItem(), o1.getItem()) .append(o2.getId(), o1.getId()) .toComparison(); }); orders.forEach(System.out::println); } }
ItemOrder
package jp.pjin.tech.java.domain; import java.io.Serializable; import org.apache.commons.lang3.builder.ToStringBuilder; public class ItemOrder implements Serializable { private static final long serialVersionUID = 1L; private int id; private String client; private String item; private int price; private int order; private int amount; public ItemOrder(int id, String client, String item, int price, int order) { this.id = id; this.client = client; this.item = item; this.price = price; this.order = order; this.amount = price * order; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getClient() { return client; } public void setClient(String client) { this.client = client; } public String getItem() { return item; } public void setItem(String item) { this.item = item; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public int getOrder() { return order; } public void setOrder(int order) { this.order = order; } public int getAmount() { return amount; } public void setAmount(int amount) { this.amount = amount; } @Override public String toString() { return ToStringBuilder.reflectionToString(this); } }
ソースを見る限り、ソートのキーが増えるとComparatorを利用した場合に見づらくなってくると思います。
それに比べて、CompareToBuilderを利用すると、1番目のソート条件、2番目のソート条件とappendする為、見やすいと思います。
因みに、compareの戻り値ですが、o1 (自オブジェクト)、o2(相手オブジェクト)とした場合、
自オブジェクトが相手オブジェクトより大きい場合(o1 > o2)は、プラスの値、
自オブジェクトが相手オブジェクトより小さい場合(o1 < o2)は、マイナスの値、同じなら0を返します。

Java apache commons StrSubstitutor サンプルプログラム

Java apache commons StrMatcher サンプルプログラム

Java apache commons StrLookup サンプルプログラム

Java apache commons StrBuilder サンプルプログラム

Java apache commons ExtendedMessageFormat サンプルプログラム

Java apache commons MethodUtils サンプルプログラム

Java apache commons InheritanceUtils サンプルプログラム

Java apache commons FieldUtils サンプルプログラム

Java apache commons ConstructorUtils サンプルプログラム
