当前位置:编程学习 > JAVA >>

J2SE基础夯实系列之List中的数据如何根据对象的某一个或多个字段排序引出Comparable和comparator的使用

第一节  对于引入题目的探讨
首先把引入题目表述的清楚一些,在一个List中存储的是一些对象实例,而对象实例包含多个属性字段,我们要根据对象的某个或者多个属性来对List进行排序。
假设List中存储的都是Student类的实例,Student类包含name、gender、id属性。首先根据Student实例中的name属性排序,如果两个名字相同,就再根据id属性排序。
Student类源码如下:
[java] 

<strong>package chapter1; 
  
public class Student { 
    private String name; 
    private String gender; 
    private int id; 
    
    public String getName() { 
        return name; 
    } 
    
    public void setName(String name) { 
        this.name = name; 
    } 
    
    public String getGender() { 
        return gender; 
    } 
    
    public void setGender(String gender) { 
        this.gender = gender; 
    } 
    
    public int getId() { 
        return id; 
    } 
    
    public void setId(int id) { 
        this.id = id; 
    } 
}</strong> 
          假设有三个学生:

                                     姓名       性别        ID
                                     宋超       男          100120
                                     伍星       男          100121
                                     宋超       女          100122
            把这三个学生存储在List里面,要求首先按照姓名进行排序,如果姓名相同就按照ID排序。
 
1.1.1第一种实现方式:使用Comparable接口;
          使用这种方式时,Student类必须继承这个接口,并且实现compareTo方法。并且compareTo方法是这个接口的唯一方法。需要注意到一点,在《Effective Java》第十二条中,提供了一个通用的写法,也就是在类继承的Comparable接口的时候,利用泛型指明能比较的类型。把Student类改写如下:
              
[java] 


package chapter1; 
  
public classStudent implementsComparable<Student>{ 
    private String name; 
    private String gender; 
    private int id; 
    
    public String getName() { 
        return name; 
    } 
    
    public void setName(String name) { 
        this.name = name; 
    } 
    
    public String getGender() { 
        return gender; 
    } 
    
    public void setGender(Stringgender) { 
        this.gender = gender; 
    } 
    
    public int getId() { 
        return id; 
    } 
    
    public void setId(int id) { 
        this.id = id; 
    } 
  
    @Override 
    public int compareTo(Student arg0){ 
        //String、Integer、Double、Float等类型都实现有compareTo方法 
        if(this.name.compareTo(arg0.name) == 0) { 
            return Integer.valueOf(id).compareTo(Integer.valueOf(arg0.id)); 
        }else{ 
            return this.name.compareTo(arg0.name); 
        } 
    } 


 
在《Effective Java》中对于compareTo方法有以下几点提示:
·自反性
·传递性
·对称性
·最好和equals方法值相同
 
那么,在客户端调用的时候,直接写如下代码:

[java] 


package chapter1; 
  
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 
  
public class ClientInte易做图ce { 
                   publicstatic void main(String[] args) { 
                            
                            Studentsongchao = new Student(); 
                            songchao.setGender("Man"); 
                            songchao.setId(100150); 
                            songchao.setName("SongChao"); 
                            
            &

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,