Java反射之对象通用排序代码介绍

精贴 置顶
1352 0

 package test;
  import java.lang.reflect.Method;
  import java.util.ArrayList;
  import java.util.Comparator;
  import java.util.List;
  import java.util.Collections;
  public class ObjectSort {
  /**
  * @param args
  */
  public static void main(String[] args) {
  /**
  *
  * author: youjianbo
  * date:2008-6-27
  * purpose: 根据对象的某个或者某些属性排序
  * 使用时只要将对象属性列表和需要排序的List传入即可
  * **/
  List arrayDemo = new ArrayList();
  Person p1 = new Person();
  p1.setName("张三");
  p1.setAge(20);
  p1.setSalary(2000);
  Person p2 = new Person();
  p2.setName("李四");
  p2.setAge(22);
  p2.setSalary(1800);
  Person p3 = new Person();
  p3.setName("王五");
  p3.setAge(25);
  p3.setSalary(1900);
  Person p4 = new Person();
  p4.setName("赵六");
  p4.setAge(25);
  p4.setSalary(3000);
  Person p5 = new Person();
  p5.setName("刘七");
  p5.setAge(30);
  p5.setSalary(2000);
  Person p6 = new Person();
  p6.setName("吕八");
  p6.setAge(25);
  p6.setSalary(2000);
  Person p7= new Person();
  p7.setName("扣九");
  p7.setAge(26);
  p7.setSalary(2000);
  Person p8= new Person();
  p8.setName("扣九哥哥");
  p8.setAge(23);
  p8.setSalary(2000);

arrayDemo.add(p1);
  arrayDemo.add(p2);
  arrayDemo.add(p3);
  arrayDemo.add(p4);
  arrayDemo.add(p5);
  arrayDemo.add(p6);
  arrayDemo.add(p7);
  arrayDemo.add(p8);
  //*********开始比较********//
  CommonComparator comparator = new CommonComparator();
  // System.out.println("------1.按照年龄从小到大比较---------");
  // comparator.setFields_user(new String[]{"age"});
  // Collections.sort(arrayDemo, comparator);
  // for(int i=0;i 
  // {
  // Person person = (Person)arrayDemo.get(i);
  // System.out.println("用户名:"+person.getName()+" 年龄:"+person.getAge()+" 月薪:"+person.getSalary());
  // }
  // System.out.println("------1.按照月薪从低到高比较---------");
  // comparator.setFields_user(new String[]{"salary"});
  // Collections.sort(arrayDemo, comparator);
  // for(int i=0;i 
  // {
  // Person person = (Person)arrayDemo.get(i);
  // System.out.println("用户名:"+person.getName()+" 年龄:"+person.getAge()+" 月薪:"+person.getSalary());
  // }
  System.out.println("------1.按照年龄和月薪从低到高比较---------");
  comparator.setFields_user(new String[]{"age","salary"});
  Collections.sort(arrayDemo, comparator);
  for(int i=0;i 
  {
  Person person = (Person)arrayDemo.get(i);
  System.out.println("用户名:"+person.getName()+" 年龄:"+person.getAge()+" 月薪:"+person.getSalary());
  }
  System.out.println("------1.按照月薪和年龄从低到高比较---------");
  comparator.setFields_user(new String[]{"salary","age"});
  Collections.sort(arrayDemo, comparator);
  for(int i=0;i 
  {
  Person person = (Person)arrayDemo.get(i);
  System.out.println("用户名:"+person.getName()+" 年龄:"+person.getAge()+" 月薪:"+person.getSalary());
  }
  }
  }
  class CommonComparator implements Comparator
  {
  /***
  * @param
  * 比较对象的属性用String[]的形式传过来
  * 比较的对象一定要符合javaBean,即要有Set,Get方法
  * */
  String[] fields_user = null;
  public String[] getFields_user() {
  return fields_user;
  }
  public void setFields_user(String[] fields_user) {
  this.fields_user = fields_user;
  }

/**
  * 定义排序规则
  * 如果按照不止一个属性进行排序
  * 这按照属性的顺序进行排序,类是sql order by
  * 即只要比较出同位置的属性就停止
  * */
  public int compare(Object obj1, Object obj2)
  {
  //没有属性,则不排序
  if(fields_user == null || fields_user.length<=0)
  {
  return 2;//不比较
  }
  for(int i=0;i 
  {
  if(compareField(obj1,obj2,fields_user[i])>0)
  {
  //如果obj1的属性值大于obj2的属性值,则返回正数
  return 1;
  }else if(compareField(obj1,obj2,fields_user[i])<0)
  {
  return -1;
  }
  }
  //相等返回0
  return 0;
  }
  /**
  * @param fieldName
  * 根据属性名排序
  * */
  private static int compareField(Object o1,Object o2,String fieldName)
  {
  try
  {
  String value1 = getFieldValueByName(fieldName,o1).toString();
  String value2 = getFieldValueByName(fieldName,o2).toString();
  if(value1.compareTo(value2)>0)
  {
  //value1大于value2
  return 1;
  }else if(value1.compareTo(value2)==0)
  {
  //相等
  return 0;
} catch (Exception e)
  {
  System.out.println("-----------------------------------------------------------------------------");
  System.out.println("---------对象的该属性不存在或者不允许在此安全级别上反射该属性,详情请查阅JAVA DOC--------");
  System.out.println("-----------------------------------------------------------------------------");
  e.printStackTrace();
  }
  //小于
  return -1;
  }
  /**
  * @param
  * fieldName 属性名
  * obj 对象
  * 反射获得该属性的值
  * */
  private static Object getFieldValueByName(String fieldName,Object obj)
  {
  try
  {
  String Letter = fieldName.substring(0,1).toUpperCase();
  String methodStr = "get"+Letter+fieldName.substring(1);
  Method method = obj.getClass().getMethod(methodStr, new Class[]{});
  Object value = method.invoke(obj, new Object[]{});
  return value;
  }catch(Exception e)
  {
  System.out.println("------------------------------------------------------");
  System.out.println("---------该"+fieldName+"属性不存在----------------------");
  System.out.println("------------------------------------------------------");
  return null;
  }
  }
  }
  class Person
  {
  public Person(){}
  private String name;
  private int age;
  private long salary;
  public long getSalary() {
  return salary;
  }
  public void setSalary(long salary) {
  this.salary = salary;
  }
  public int getAge() {
  return age;
  }
  public void setAge(int age) {
  this.age = age;
  }
  public String getName() {
  return name;
  }
  public void setName(String name) {
  this.name = name;
  }
  }

  • 没有任何评论
今日天气 ···

···

···

···

热门排行
CSS cursor鼠标样式一览表 2012-06-25
.NET后台写JS代码 2011-11-03
网站地址多出jdfwkey的问题解析及... 2010-08-25
数据库xxx的日志已满,请备份该数... 2013-07-19
百度、google、Yahoo网站地图制作... 2011-01-30
<a>标签的伪类书写顺序问题... 2010-09-04
什么是长尾关键词? 2010-09-24
CEO名言 2010-08-31
Mysql 主从数据库同步 2010-09-12
用ASP实现网页BBS 2010-11-01
博主推荐
本个人博客微信公众平台上线啦~~... 2013-10-13
饼哥网络互联上线啦~~要买域名空... 2013-09-20
网站title标题如何正确修改不会被... 2013-08-26
饼哥通讯录系统上线啦,欢迎大家... 2013-08-24
ASP .NET MYSQL 的简单分页 并不... 2013-08-19
网站有弹窗广告这样的站点,百度... 2013-08-17
做淘宝SEO优化需要注意的8大问题 2013-08-17
淘宝网怎么做SEO优化 2013-08-17
站长们要学习的“苍井空精神” 2013-08-17
苹果公司今日发布了iOS 7第五个开... 2013-08-07
随便看看
55条SEO必备技巧 2010-09-07
一个字符串"234.157.698.0" 要求... 2010-11-29
C#笔试题 2010-09-03
用js如何确定一个多选select是选... 2010-09-12
js省市级联菜单 2010-10-13
路由器的口令设置 2010-11-05
ASP.NET上传文件 2010-09-08
用电脑需避讳的几个小动作 2010-11-08
PHP调用Jmail组件发邮件代码 2010-09-13
隐藏文本和链接 2010-09-21
RSS新闻
传媒新闻
CSDN
八卦新闻
女性新闻
台湾新闻
互联网
军事-新浪博客
IT-新浪博客
汽车新闻
游戏新闻
国际新闻
国内新闻
体育新闻
我的微博
北京 上海 杭州 深圳 广州 成都