之前Arrays 类中存在sort() 方法, 此方法可以直接对 对象数组进行排序。
1.Comparable接口
可以直接使用java.util.Arrays 类进行数组的排序操作,但对象所在的类必须实现Comparable 接口,用于指定排序接口。
Comparable 接口定义如下:
public interface Comparable{
public int compareTo(T o);
}
此方法返回一个int 类型的数据,但是此int 的值只能是以下三种:
1:表示大于
-1:表示小于
0:表示相等
要求:
定义一个学生类,里面有姓名、年龄、成绩三个属性,要求按成绩由高到低排序,如果成绩相等,则按照年龄由低到高排序。
class Student implements Comparable {// 指定类型为Studentprivate String name ;private int age ;private float score ;public Student(String name,int age,float score){this.name = name ;this.age = age ;this.score = score ;}public String toString(){return name + "\t\t" + this.age + "\t\t" + this.score ;}public int compareTo(Student stu){// 覆写compareTo()方法,实现排序规则的应用if(this.score>stu.score){return -1 ;}else if(this.score实际上比较器的操作,就是经常听到的二叉树的排序算法。通过二叉树进行排序,之后利用中序遍历的方法把内容依次读取出来。
排序的基本原理,使用第一个元素作为根节点,之后如果后面的内容比根节点要大,则放在左子树,如果内容比根节点的内容要大,则放在右子树。
下面就自己手式实现一个二叉树的比较算法。
为了操作方便,此处使用Integer 类完成。
public class ComparableDemo02{public static void main(String args[]){Comparable com = null ;// 声明一个Comparable接口对象com = 30 ;// 通过Integer为Comparable实例化System.out.println("内容为:" + com) ;// 调用的是toString()方法}};了解了此特性之后,下面就可以动物完成一个二叉树算法。class BinaryTree{class Node{// 声明一个节点类private Comparable data ;// 保存具体的内容private Node left ;// 保存左子树private Node right ;// 保存右子树public Node(Comparable data){this.data = data ;}public void addNode(Node newNode){// 确定是放在左子树还是右子树if(newNode.data.compareTo(this.data)<0){// 内容小,放在左子树if(this.left==null){this.left = newNode ;// 直接将新的节点设置成左子树}else{this.left.addNode(newNode) ;// 继续向下判断}}if(newNode.data.compareTo(this.data)>=0){// 放在右子树if(this.right==null){this.right = newNode ;// 没有右子树则将此节点设置成右子树}else{this.right.addNode(newNode) ;// 继续向下判断}}}public void printNode(){// 输出的时候采用中序遍历if(this.left!=null){this.left.printNode() ;// 输出左子树}System.out.print(this.data + "\t") ;if(this.right!=null){this.right.printNode() ;}}};private Node root ;// 根元素public void add(Comparable data){// 加入元素Node newNode = new Node(data) ;// 定义新的节点if(root==null){// 没有根节点root = newNode ;// 第一个元素作为根节点}else{root.addNode(newNode) ; // 确定是放在左子树还是放在右子树}}public void print(){this.root.printNode() ;// 通过根节点输出}};public class ComparableDemo03{public static void main(String args[]){BinaryTree bt = new BinaryTree() ;bt.add(8) ;bt.add(3) ;bt.add(3) ;bt.add(10) ;bt.add(9) ;bt.add(1) ;bt.add(5) ;bt.add(5) ;System.out.println("排序之后的结果:") ;bt.print() ;}};另一种比较器:Comparator如果一个类已经开发完成,但是在此类建立的初期并没有实现Comparable接口,此时肯定是无法进行对象排序操作的所以为了解决这样的问题,java又定义了另一个比较器的操作接口——Comparator。
此接口定义在java.util 包中,接口定义如下:
public interface Comparator{
public int compare(T o1, T o2);
boolean equals(Object obj);
}
下面定义一个自己的类,此类没有实现Comparable接口。
import java.util.* ;class Student{// 指定类型为Studentprivate String name ;private int age ;public Student(String name,int age){this.name = name ;this.age = age ;}public boolean equals(Object obj){// 覆写equals方法if(this==obj){return true ;}if(!(obj instanceof Student)){return false ;}Student stu = (Student) obj ;if(stu.name.equals(this.name)}else{return false ;}}public void setName(String name){this.name = name ;}public void setAge(int age){this.age = age ;}public String getName(){return this.name ;}public int getAge(){return this.age ;}public String toString(){return name + "\t\t" + this.age ;}};class StudentComparator implements Comparator{// 实现比较器// 因为Object类中本身已经有了equals()方法public int compare(Student s1,Student s2){if(s1.equals(s2)){return 0 ;}else if(s1.getAge()在使用中尽可以还是作用Comparable 在需要排序的类上实现好此接口,而Comparator 需要单独建立一个排序的类,这样如果有很多的话,则排序的规则类也就会非常多,操作起来比较麻烦。
掌握一点:只要是对象排序,则在javak 永远是以Comparable 接口为准的。
【文章转自阿里云服务器代理商 http://www.558idc.com/aliyun.html 复制请保留原URL】