比较器(Comparable)
对于比较器首先给出一个明确的定义:基本上存在原理分析,而在实际开发中使用的意义不大
如果要想进行数组操作Arrays类可以提供很好的支持
对象数组排序:public static void sort(Object[] a);
对象要进行数组的实现,必须定义Comparable接口:
1 package cn.Tony.demo; 2 import java.util.Arrays; 3 class Person implements Comparable<Person>{ 4 private String name; 5 private int age; 6 public Person(String name, int age) { 7 super(); 8 this.name = name; 9 this.age = age; 10 } 11 @Override 12 public String toString() { 13 return "Person [name=" + name + ", age=" + age + "] "; 14 } 15 @Override 16 public int compareTo(Person o) { 17 if(this.age>o.age) { 18 return 1;//大于 19 }else if(this.age<o.age){ 20 return -1; 21 }else { 22 return 0; 23 } 24 } 25 } 26 public class TestDemo { 27 public static void main(String[] args) throws Exception { 28 Person[] per=new Person[] {new Person("张三",20), 29 new Person("李四",19),new Person("王五",21)};//对象数组 30 Arrays.sort(per); 31 System.out.println(Arrays.toString(per)); 32 } 33 }
要想实现对象数组的排序就要实现Comparable接口
二叉树
在之前学习过链表程序,链表程序的本质是在于节点的相互引用。但是之前的链表有一个 缺点,所有的保存数据的顺序就是你添加顺序无法排序,如果要想进行排序的保存,就可以通过树的结构完成,
树的结构:取第一个数据作为根节点,而后比这个根节点大的数据放在节点的右边,如果比根节点小的放在左子树 在进行输出的时候按照中序遍历的原则取出:左中右
树的结构实现就是大小的比较,可以用Comparable接口完成,
范例:实现二叉树
1 package cn.Tony.demo; 2 3 import java.util.Arrays; 4 5 @SuppressWarnings("rawtypes") 6 class BinaryTree{ //现在实现一个二叉树 7 private class Node{ 8 private Comparable data;//保存的操作数据,必须是Comparable子类并且要判断大小 9 private Node left;//保存左边的节点 10 private Node right;//保存右边节点 11 @SuppressWarnings("unused") 12 public Node(Comparable data) { 13 this.data=data; 14 } 15 @SuppressWarnings("unchecked") 16 public void addNode(Node newNode) { 17 if(this.data.compareTo(newNode.data)>0) { 18 if(this.left==null) { 19 this.left=newNode; 20 }else { 21 this.left.addNode(newNode); 22 } 23 }else { 24 if(this.right==null) { 25 this.right=newNode; 26 }else { 27 this.right.addNode(newNode); 28 } 29 } 30 } 31 public void toArrayNode() { 32 if(this.left!=null) { //有节点 33 this.left.toArrayNode(); 34 } 35 BinaryTree.this.retData[BinaryTree.this.foot++]=this.data; 36 if(this.right!=null) { 37 this.right.toArrayNode(); 38 } 39 } 40 } 41 //--------------------------------// 42 private Node root;//任何的数据结构一定要抓住一个根 43 private int count;//保存个数 44 private int foot=0;//脚标 45 private Object[] retData;//返回数据 46 public Object[] toArray() { 47 this.foot=0;//脚标清零 48 this.retData=new Object[this.count]; 49 this.root.toArrayNode(); 50 return this.retData; 51 } 52 public void add(Object data) {//可以保存任何数据 53 if(data==null) { 54 return ; 55 } 56 Node newNode=new Node((Comparable)data); 57 if(this.root==null) { 58 this.root=newNode; 59 }else { 60 this.root.addNode(newNode); 61 } 62 this.count++; 63 } 64 } 65 public class TestDemo { 66 public static void main(String[] args) throws Exception { 67 BinaryTree bt=new BinaryTree(); 68 bt.add("B"); 69 bt.add("X"); 70 bt.add("A"); 71 System.out.println(Arrays.toString(bt.toArray())); 72 } 73 }
如果要有兴趣可以继续将之前链表的功能在此处实现
挽救的比较器:Comparator()
Comparator的核心价值在于:当一个类定义的时候就已经明确好了这个类的数据保存是需要排序的,但很多情况下,一个类的设计的时候可能没有考虑到排序的需要。
如果类中不允许修改想要进行排序需要使用java.util.Comparator
Comparable和Comparator的区别
java.lang.Comparable:是在一个类定义的时候默认实现好的接口,里面存在ComparaTo()方法
java.util.Comparator:是挽救的比较接口,需要单独的比较的规则类,里面有Comparator方法和equals方法。
以后分析还是Comparable的类