Sponsored link


Jakarta Commons Lang ComparaToBuilder.class
このクラスを使うと簡単に、(compara)比較を実装することができます。
使い方はコードを見ていただければと思います。
例
Bookクラスを使った例
Bookクラスがあります。これはtitle・author・price 3つのプロパティーを持っています。
いきなり話が飛躍しますが、
このBookクラスをソートする属性をしていできるBookComparatorを作りました。
これを使うことで、Bookをtitle・author・priceのいずれでソートするか。昇順にするか降順にするかしていできます。
出力結果
{about Java,jack,2000,at java,lord,100,everything Java,tom,500,my java,bob,3000} {my java,bob,3000,everything Java,tom,500,at java,lord,100,about Java,jack,2000} {my java,bob,3000,about Java,jack,2000,at java,lord,100,everything Java,tom,500} {everything Java,tom,500,at java,lord,100,about Java,jack,2000,my java,bob,3000} {at java,lord,100,everything Java,tom,500,about Java,jack,2000,my java,bob,3000} {my java,bob,3000,about Java,jack,2000,everything Java,tom,500,at java,lord,100}
プログラム
List list=new Vector(); list.add(new Book("about Java","jack",2000)); list.add(new Book("everything Java","tom",500)); list.add(new Book("my java","bob",3000)); list.add(new Book("at java","lord",100)); Book[] books=(Book[])list.toArray(new Book[list.size()]); BookComparator bc=new BookComparator(); bc.setType(BookComparator.TITLE); bc.setAscending(true); Arrays.sort(books,bc); System.out.println(ArrayUtils.toString(books)); bc.setType(BookComparator.TITLE); bc.setAscending(false); Arrays.sort(books,bc); System.out.println(ArrayUtils.toString(books)); bc.setType(BookComparator.AUTHOR); bc.setAscending(true); Arrays.sort(books,bc); System.out.println(ArrayUtils.toString(books)); bc.setType(BookComparator.AUTHOR); bc.setAscending(false); Arrays.sort(books,bc); System.out.println(ArrayUtils.toString(books)); bc.setType(BookComparator.PRICE); bc.setAscending(true); Arrays.sort(books,bc); System.out.println(ArrayUtils.toString(books)); bc.setType(BookComparator.PRICE); bc.setAscending(false); Arrays.sort(books,bc); System.out.println(ArrayUtils.toString(books));
■Book.java
package test; /** * * */ public class Book { private int price; private String title; private String author; public Book(String title,String author,int price){ this.title=title; this.author=author; this.price=price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String toString(){ return title+","+author+","+price; } }
■BookComparator.java
/* * Created on 2004/10/22 * Author aki@www.xucker.jpn.org * License Apache2.0 or Common Public License */ package test; import java.util.Comparator; import org.apache.commons.lang.builder.CompareToBuilder; /** * * */ public class BookComparator implements Comparator{ private int type; public boolean isAscending() { return ascending; } public void setAscending(boolean ascending) { this.ascending = ascending; } public int getType() { return type; } public void setType(int type) { this.type = type; } public final static int TITLE=0; public final static int AUTHOR=1; public final static int PRICE=2; /* (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ public int compare(Object o1, Object o2) { if(o1 instanceof Book && o2 instanceof Book){ Book book1; Book book2; if(ascending){ book1=(Book)o1; book2=(Book)o2; }else{ book1=(Book)o2; book2=(Book)o1; } CompareToBuilder builder= new CompareToBuilder(); if(type==TITLE){ builder.append(book1.getTitle(),book2.getTitle()).append(book1.getAuthor(),book2.getAuthor()).append(book1.getPrice(),book2.getPrice()); } else if(type==AUTHOR){ builder.append(book1.getAuthor(),book2.getAuthor()).append(book1.getTitle(),book2.getTitle()).append(book1.getPrice(),book2.getPrice()); }else if(type==PRICE){ builder.append(book1.getPrice(),book2.getPrice()).append(book1.getTitle(),book2.getTitle()).append(book1.getAuthor(),book2.getAuthor()); } return builder.toComparison(); }else return 0; } private boolean ascending=true; }
汎用Bean用 Comparator
ソートをbean名で指定でき汎用的なComparatorを作ってみました。
BeanUtilsのPropertyUtilsを使っています。
実行速度は遅いと思いますが、手を抜きたいときには使えると思います。
/* * Created on 2004/10/22 * Author aki@www.xucker.jpn.org * License Apache2.0 or Common Public License */ package test; import java.lang.reflect.InvocationTargetException; import java.util.Comparator; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang.builder.CompareToBuilder; /** * * */ public class BeanComparator implements Comparator{ private String bean; private boolean ascending=true; public boolean isAscending() { return ascending; } public void setAscending(boolean ascending) { this.ascending = ascending; } public String getBean() { return bean; } public void setBean(String bean) { this.bean = bean; } public int compare(Object o1, Object o2) { CompareToBuilder builder= new CompareToBuilder(); try { if(ascending) builder.append(PropertyUtils.getProperty(o1,bean),PropertyUtils.getProperty(o2,bean)); else builder.append(PropertyUtils.getProperty(o2,bean),PropertyUtils.getProperty(o1,bean)); return builder.toComparison(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; } }

