Java排序对象Comparable和Compartor

来源:互联网 发布:上海大学校园有线网络 编辑:程序博客网 时间:2024/06/06 02:51

当集合中存储的都是对象时,我们要对其进行排序,就要借助于Comparator或Comparable,以简单的方式实现对象排序或自定义排序。
例子:一个对象类:

public class UserPo{             // 名字      private String name;      // 年龄      private int age;      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;             }   } 


1:使用Comparator接口实现排序:实现其compare方法,根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数来判断大小。
强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。

import java.util.Comparator;  public class MyCompare implements Comparator<Object>{                        public int compare(Object o0, Object o1) {                UserPo user0 = (UserPo) o0;                UserPo user1 = (UserPo) o1;                if (user0.getAge() > user1.getAge()) {                    return 1; // 第一个大于第二个                } else if (user0.getAge() < user1.getAge()) {                    return -1;// 第一个小于第二个                } else {                    return 0; // 等于                }            }        }   


测试代码:

import java.util.ArrayList;        import java.util.Collections;               public class Test {                   public static void main(String args[]){                                String sql="select name,age from users";                // 从数据库中得到数据并组装对象集合                ArrayList<UserPo> array =BaseDao.getyAll(sql);                MyCompare comp = new MyCompare();                // 执行排序方法                Collections.sort(array,comp);                for(UserPo p:array) {                    System.out.println(p.getName()+":"+p.getAge());                }                            }        }  


getAll()方法:

public static ArrayList<UserPo> getyAll(String sql) {      ArrayList<UserPo> list = new ArrayList<UserPo>();             ResultSet rs = null;            PreparedStatement ps = null;            try {                Connection con = JdbcUtils.getMsConnection();                ps = con.prepareStatement(sql);                rs = ps.executeQuery();                while (rs.next()) {                    UserPo p = new UserPo();                    p.setName(rs.getString("name"));                    p.setAge(rs.getInt("age"));                    list.add(p);                }            } catch (Exception e) {                e.printStackTrace();            }        return list; }     


2:使用Comparable接口完成排序:实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。对UserPo类进行改装

 import java.util.ArrayList;         import java.util.Collections;         public class UserPo implements Comparable  {                          private String name;                          private int age;                     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;             }             /**           * compareTo           */            public int compareTo(Object o) {                 return this.age-((UserPo)o).getAge();             }             // 测试             public static void main(String args[]){                 String sql="select name,age from users";                 ArrayList<UserPo> array =BaseDao.getyAll(sql);                 // 执行排序方法                 Collections.sort(array);                 for(UserPo p:array) {                     System.out.println(p.getName()+":"+p.getAge());                 }             }         } 


这两个接口的比较:
1:Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序
2:一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。一般我们写的bean都要实现这一接口,这也是标准javabean的规范。
3:Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1) 类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2) 可以使用多种排序标准,比如升序、降序等。

0 0
原创粉丝点击