zhouln 发表于 2015-8-1 07:42:36

apache之beanutils包比较工具类ComparatorUtils

  关于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 "";
}
}
  我们先按原先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"};
ArrayListlist=new ArrayList();
list.add(new Person(1,names, 20));
list.add(new Person(1,names, 21));
list.add(new Person(2,names, 22));
list.add(new Person(3,names, 24));
list.add(new Person(2,names, 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"};
ArrayListlist=new ArrayList();
list.add(new Person(1,names, 20));
list.add(new Person(1,names, 21));
list.add(new Person(2,names, 22));
list.add(new Person(3,names, 24));
list.add(new Person(2,names, 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);//逆序
ArrayListsortFields=new ArrayList();
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!
  
页: [1]
查看完整版本: apache之beanutils包比较工具类ComparatorUtils