關於beanutils
beanutils是apache開源組織中的一個包,主要是為了更好的讓開發者隔離JAVA包中自帶的及其strus,spring等框架中
復雜的bean工具類的使用。
開源地址:http://commons.apache.org/beanutils/
這里主要介紹下beanutils下的ComparatorUtils的使用
直接上代碼
public class Person { int id; private String name; int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public Person(){} public String toString() { return "[id=" + this.id + ",name=" + this.name +",age=" + this.age +"]"; } }
我們先按原先java自帶的方式來處理
public class ComparatorDemo implements java.util.Comparator { public int compare(Object o1, Object o2) { if (o1 instanceof Person) { //按ID倒敘 name正序重新排列 Person p1 = (Person) o1; Person p2 = (Person) o2; if (p1.getId() > p2.getId()) return -1; else if (p1.getId() < p2.getId()) return 1; else { if (p1.getName().compareTo(p2.getName()) > 0) return 1; else if (p1.getName().compareTo(p2.getName()) == 0) return 0; else return -1; } } return 0; } public static void main(String[] args) { String names[]={"a","b"}; ArrayList<Object>list=new ArrayList<Object>(); list.add(new Person(1,names[1], 20)); list.add(new Person(1,names[0], 21)); list.add(new Person(2,names[1], 22)); list.add(new Person(3,names[1], 24)); list.add(new Person(2,names[0], 23)); for (Iterator iterator = list.iterator(); iterator.hasNext();) { Person person = (Person) iterator.next(); System.out.println(person.getId()+"--"+person.getName()); } Collections.sort(list,new ComparatorDemo()); System.err.println("****對比前后*****"); for (Iterator iterator = list.iterator(); iterator.hasNext();) { Person person = (Person) iterator.next(); System.out.println(person.getId()+"--"+person.getName()); } } }
打印結果:
1--b 1--a 2--b 3--b 2--a ****對比前后***** 3--b 2--a 2--b 1--a 1--b
然后我們在用beanutils包下的
ComparatorUtils來實現
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import org.apache.commons.beanutils.BeanComparator; import org.apache.commons.collections.ComparatorUtils; import org.apache.commons.collections.comparators.ComparableComparator; import org.apache.commons.collections.comparators.ComparatorChain; public class ComparatorUtilDemo { public static void main(String[] args) { String names[]={"a","b"}; ArrayList<Object>list=new ArrayList<Object>(); list.add(new Person(1,names[1], 20)); list.add(new Person(1,names[0], 21)); list.add(new Person(2,names[1], 22)); list.add(new Person(3,names[1], 24)); list.add(new Person(2,names[0], 23)); for (Iterator iterator = list.iterator(); iterator.hasNext();) { Person person = (Person) iterator.next(); System.out.println(person.getId()+"--"+person.getName()); } // Comparator mycmp=ComparableComparator.getInstance(); mycmp=ComparatorUtils.nullLowComparator(mycmp);//允許null mycmp=ComparatorUtils.reversedComparator(mycmp);//逆序 ArrayList<Object>sortFields=new ArrayList<Object>(); sortFields.add(new BeanComparator("id",mycmp)); sortFields.add(new BeanComparator("name")); ComparatorChain multiSort=new ComparatorChain(sortFields); Collections.sort(list, multiSort); System.err.println("****對比前后*****"); for (Iterator iterator = list.iterator(); iterator.hasNext();) { Person person = (Person) iterator.next(); System.out.println(person.getId()+"--"+person.getName()); } } }
打印結果:
1--b 1--a 2--b 3--b 2--a ****對比前后***** 3--b 2--a 2--b 1--a 1--b
發現兩者結果一樣。當然也可以選用Comparable來實現,效果是一樣的
區別在於當我們不想改變原先代碼邏輯的情況下,使用Comparable會更合適。
the end!