比较器(Comparable、Comparator)类及 二叉树的排序算法

之前Arrays 类中存在sort() 方法, 此方法可以直接对 对象数组进行排序。

1.Comparable接口

可以直接使用java.util.Arrays 类进行数组的排序操作,但对象所在的类必须实现Comparable 接口,用于指定排序接口。

Comparable 接口定义如下:

public interface Comparable<T>{

public int compareTo(T o);

}

此方法返回一个int 类型的数据,但是此int 的值只能是以下三种:

  1:表示大于

  1:表示小于

  0:表示相等

要求:

定义一个学生类,里面有姓名、年龄、成绩三个属性,要求按成绩由高到低排序,如果成绩相等,则按照年龄由低到高排序。

 1 class Student implements Comparable<Student> {    // 指定类型为Student
 2     private String name ;
 3     private int age ;
 4     private float score ;
 5     public Student(String name,int age,float score){
 6         this.name = name ;
 7         this.age = age ;
 8         this.score = score ;
 9     }
10     public String toString(){
11         return name + "\t\t" + this.age + "\t\t" + this.score ;
12     }
13     public int compareTo(Student stu){    // 覆写compareTo()方法,实现排序规则的应用
14         if(this.score>stu.score){
15             return -1 ;
16         }else if(this.score<stu.score){
17             return 1 ;
18         }else{
19             if(this.age>stu.age){
20                 return 1 ;
21             }else if(this.age<stu.age){
22                 return -1 ;
23             }else{
24                 return 0 ;
25             }
26         }
27     }
28 }
29 public class ComparableDemo01{
30     public static void main(String args[]){
31         Student stu[] = {new Student("张三",20,90.0f),
32             new Student("李四",22,90.0f),new Student("王五",20,99.0f),
33             new Student("赵六",20,70.0f),new Student("孙七",22,100.0f)} ;
34         java.util.Arrays.sort(stu) ;    // 进行排序操作
35         for(int i=0;i<stu.length;i++){    // 循环输出数组中的内容
36             System.out.println(stu[i]) ;
37         }
38     }
39 }

2.分析比较器的排序原理

实际上比较器的操作,就是经常听到的二叉树的排序算法。通过二叉树进行排序,之后利用中序遍历的方法把内容依次读取出来。

排序的基本原理,使用第一个元素作为根节点,之后如果后面的内容比根节点要大,则放在左子树,如果内容比根节点的内容要大,则放在右子树。

下面就自己手式实现一个二叉树的比较算法。

为了操作方便,此处使用Integer 类完成。

1 public class ComparableDemo02{
2     public static void main(String args[]){
3         Comparable com = null ;            // 声明一个Comparable接口对象
4         com = 30 ;                        // 通过Integer为Comparable实例化
5         System.out.println("内容为:" + com) ;    // 调用的是toString()方法
6     }
7 };

了解了此特性之后,下面就可以完成一个二叉树算法。

 1 class BinaryTree{
 2     class Node{            // 声明一个节点类
 3         private Comparable data ;    // 保存具体的内容
 4         private Node left ;            // 保存左子树
 5         private Node right ;        // 保存右子树
 6         public Node(Comparable data){
 7             this.data = data ;
 8         }
 9         public void addNode(Node newNode){
10             // 确定是放在左子树还是右子树
11             if(newNode.data.compareTo(this.data)<0){    // 内容小,放在左子树
12                 if(this.left==null){
13                     this.left = newNode ;    // 直接将新的节点设置成左子树
14                 }else{
15                     this.left.addNode(newNode) ;    // 继续向下判断
16                 }
17             }
18             if(newNode.data.compareTo(this.data)>=0){    // 放在右子树
19                 if(this.right==null){
20                     this.right = newNode ;    // 没有右子树则将此节点设置成右子树
21                 }else{
22                     this.right.addNode(newNode) ;    // 继续向下判断
23                 }
24             }
25         }
26         public void printNode(){    // 输出的时候采用中序遍历
27             if(this.left!=null){
28                 this.left.printNode() ;    // 输出左子树
29             }
30             System.out.print(this.data + "\t") ;
31             if(this.right!=null){
32                 this.right.printNode() ;
33             }
34         }
35     };
36     private Node root ;        // 根元素
37     public void add(Comparable data){    // 加入元素
38         Node newNode = new Node(data) ;    // 定义新的节点
39         if(root==null){    // 没有根节点
40             root = newNode ;    // 第一个元素作为根节点
41         }else{
42             root.addNode(newNode) ; // 确定是放在左子树还是放在右子树
43         }
44     }
45     public void print(){
46         this.root.printNode() ;    // 通过根节点输出
47     }
48 };
49 public class ComparableDemo03{
50     public static void main(String args[]){
51         BinaryTree bt = new BinaryTree() ;
52         bt.add(8) ;
53         bt.add(3) ;
54         bt.add(3) ;
55         bt.add(10) ;
56         bt.add(9) ;
57         bt.add(1) ;
58         bt.add(5) ;
59         bt.add(5) ;
60         System.out.println("排序之后的结果:") ;
61         bt.print() ;
62     }
63 };

另一种比较器:Comparator
如果一个类已经开发完成,但是在此类建立的初期并没有实现Comparable接口,此时肯定是无法进行对象排序操作的所以为了解决这样的问题,java又定义了另一个比较器的操作接口——Comparator。

此接口定义在java.util 包中,接口定义如下:

public interface Comparator<T>{

public int compare(T o1, T o2);

boolean equals(Object obj);

}

下面定义一个自己的类,此类没有实现Comparable接口。

 1 import java.util.* ;
 2 class Student{    // 指定类型为Student
 3     private String name ;
 4     private int age ;
 5     public Student(String name,int age){
 6         this.name = name ;
 7         this.age = age ;
 8     }
 9     public boolean equals(Object obj){    // 覆写equals方法
10         if(this==obj){
11             return true ;
12         }
13         if(!(obj instanceof Student)){
14             return false ;
15         }
16         Student stu = (Student) obj ;
17         if(stu.name.equals(this.name)&&stu.age==this.age){
18             return true ;
19         }else{
20             return false ;
21         }
22     }
23     public void setName(String name){
24         this.name = name ;
25     }
26     public void setAge(int age){
27         this.age = age ;
28     }
29     public String getName(){
30         return this.name ;
31     }
32     public int getAge(){
33         return this.age ;
34     }
35     public String toString(){
36         return name + "\t\t" + this.age  ;
37     }
38 };
39
40 class StudentComparator implements Comparator<Student>{    // 实现比较器
41     // 因为Object类中本身已经有了equals()方法
42     public int compare(Student s1,Student s2){
43         if(s1.equals(s2)){
44             return 0 ;
45         }else if(s1.getAge()<s2.getAge()){    // 按年龄比较
46             return 1 ;
47         }else{
48             return -1 ;
49         }
50     }
51 };
52
53 public class ComparatorDemo{
54     public static void main(String args[]){
55         Student stu[] = {new Student("张三",20),
56             new Student("李四",22),new Student("王五",20),
57             new Student("赵六",20),new Student("孙七",22)} ;
58         java.util.Arrays.sort(stu,new StudentComparator()) ;    // 进行排序操作
59         for(int i=0;i<stu.length;i++){    // 循环输出数组中的内容
60             System.out.println(stu[i]) ;
61         }
62     }
63 };

总结:
在使用中尽可以还是作用Comparable 在需要排序的类上实现好此接口,而Comparator 需要单独建立一个排序的类,这样如果有很多的话,则排序的规则类也就会非常多,操作起来比较麻烦。

掌握一点:只要是对象排序,则在javak 永远是以Comparable 接口为准的。

比较器(Comparable、Comparator)类及 二叉树的排序算法,布布扣,bubuko.com

时间: 2024-12-11 05:58:49

比较器(Comparable、Comparator)类及 二叉树的排序算法的相关文章

(2)Java数据结构--二叉树 -和排序算法实现

=== 注释:此人博客对很多个数据结构类都有讲解-并加以实例 Java API —— ArrayList类 & Vector类 & LinkList类Java API —— BigDecimal类Java API —— BigInteger类Java API —— Calendar类Java API —— DateFormat类Java API —— Date类Java API —— HashMap类 & LinkedHashMap类Java API —— JDK5新特性Java

十大排序算法总结(Python3实现)

十大排序算法总结(Python3实现) 本文链接:https://blog.csdn.net/aiya_aiya_/article/details/79846380 目录 一.概述 二.算法简介及代码展示 1.冒泡排序 2.简单选择排序 3.简单插入排序 4.堆排序 5.快速排序 6.希尔排序 7.归并排序 8.计数排序 9.桶排序 10.基数排序 11.#代码说明 三.感悟总结 ________________________________________ 一.概述 排序算法大概是hello

Comparable与Comparator,java中的排序与比较

1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如string提供了按字母进行比较,int提供了按整数大小进行比较. 2:Comparable与Comparator but,在软件开发的世界中,任何没有代码的堆概念都是耍流氓.所以,无论我们解释的多么完美,必须show me the code: 我们首先看这样一段代码: public class Collect

使用Integer类实现二叉树排序

class BinaryTree {     class Node {         private Comparable data;         private Node left;         private Node right;         public void addNode(Node newNode) {             if (newNode.data.compareTo(this.data) < 0) {                 if (this.

java比较器Comparable接口和Comaprator接口

java的比较器有两类,分别是Comparable接口和Comparator接口. 在为对象数组进行排序时,比较器的作用非常明显,首先来讲解Comparable接口. 让需要进行排序的对象实现Comparable接口,重写其中的compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用java.util.Arrays.sort()来排序对象数组,实例如下: class Student implements Comparable<Student>{ private String n

Java学习笔记--Comparable &amp; Comparator

一.    Comparable<T>: Comparable是类内部的比较器,用于创建类的时候实现此接口,同时实现比较方法:对于不能修改源码的类则无法应用此方式进行比较排序等. 源码为: 1 public interface Comparable<T> { 2 public int compareTo(T o); 3 } 可以使用如Arrays.sort(T[] a)或Collections.sort(List<T> list)来使用实现了Comparable<

java比较器Comparable接口和Comaprator接口的比较

Comparable接口:让自定义的对象具有比较规则 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; /* * Comparable接口:让自定义的对象具有比较规则 * * */ public class ComparableDemo { public static void main(String[] args) { ArrayList<Student> list =

比较接口(Comparable ,Comparator)及流的聚合操作

Comparable 及 Comparator 的区别 Comparable 一个内比较器,类可以和自己比较 compareTo() 自然比较方法 public interface Comparable<T>{ public int compareTo(T o); } public class Book implements Comparable<Book>{ String name; int price; public Book(String name,int price){ s

java Comparator 实现不一样的排序

程序员面试宝典中,大家应该都看过各种排序方法: 冒泡 选择 插入 快速 堆排序 等等.. 这些针对的都是简单的数据类型,比如数值型int类型,当遇到实际情况中的复杂排序,比如对一个公司的员工,依据姓名,年龄,性别等不同的因素综合排序的情形,用上面的排序方法,将无法实现.但是不要害怕-java中有大神器:Comparator接口 我们来看下源码,简单的让你不知道该怎么做.. public interface Comparator<T> { /** * Compares its two argum