アキはフリーランスのプログラマーです >> Java >> Jakarta >> Commons >> Lang
Sponsored link

このエントリーを含むはてなブックマーク このエントリーを含むECナビ人気ニュース

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;
    }
    
   

}

このエントリーを含むはてなブックマーク このエントリーを含むECナビ人気ニュース