zoukankan      html  css  js  c++  java
  • java学习笔记13比较器(Comparable、Comparator)

    Comparable接口的作用

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

    Comparable接口

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

    Comparable接口的定义如下:

    public  interface  Comparable<T>{

            public  int compareTo(T  o);

    }

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

    1:表示大于

    -1:表示小于

    0:表示相等

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

    package com.itmyhome;
    
    import java.util.Arrays;
    
    class Student implements Comparable<Student>{
    	private 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;
    	}
    	
    	@Override
    	public int compareTo(Student stu) {  //覆写compareTo方法实现排序规则的应用
    		if(this.score>stu.score){
    			return -1;
    		}else if(this.score<stu.score){
    			return 1;
    		}else{
    			if(this.age>stu.age){
    				return 1;
    			}else if(this.age<stu.age){
    				return -1;
    			}else{
    				return 0;
    			}
    		}
    	}
    	
    	public String toString(){
    		return "姓名:"+this.name+", 年龄:"+this.age+", 成绩:"+this.score;
    	}
    	
    	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;
    	}
    	public float getScore() {
    		return score;
    	}
    	public void setScore(float score) {
    		this.score = score;
    	}
    	
    	
    }
    
    public class T {
    	public static void main(String[] args) throws Exception{
    		Student stu[] = {new Student("张三",22,80f)
    						,new Student("李四",23,83f)
    						,new Student("王五",21,80f)};
    		
    		Arrays.sort(stu);   //进行排序操作
    		for (int i = 0; i < stu.length; i++) {
    			Student s = stu[i];
    			System.out.println(s);
    		}
    	}
    }
    
    
    


    分析比较器的排序原理

    实际上比较器的操作,就是经常听到的二叉树的排序算法。

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

    package com.itmyhome;
    
    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 T2 {
    	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();
    	}
    };
    


     

    另一种比较器:Compartor

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

    public  interface  Comparator<T>{

                     public  int  compare(T o1,T o2);

                     boolean  equals(Object  obj);

    }

    MyComparator.java

    package com.itmyhome;
    
    import java.util.Comparator;
    
    public class MyComparator implements Comparator<Student> {  //实现比较器
    
    	@Override
    	public int compare(Student stu1, Student stu2) {
    		// TODO Auto-generated method stub
    		if(stu1.getAge()>stu2.getAge()){
    			return 1;
    		}else if(stu1.getAge()<stu2.getAge()){
    			return -1;
    		}else{
    			return 0;
    		}
    	}
    
    }
    


     

    package com.itmyhome;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;
    
    class Student {
    	private String name;
    	private int age;
    	
    	public Student(String name,int age ){
    		this.name = name;
    		this.age = age;
    	}
    	
    	public String toString(){
    		return "姓名:"+this.name+", 年龄:"+this.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;
    	}
    }
    
    public class T {
    	public static void main(String[] args) throws Exception{
    		Student stu[] = {new Student("张三",23)
    						,new Student("李四",26)
    						,new Student("王五",22)};
    		Arrays.sort(stu,new MyComparator());             //对象数组进行排序操作
    		
    		List<Student> list = new ArrayList<Student>();
    		list.add(new Student("zhangsan",31));
    		list.add(new Student("lisi",30));
    		list.add(new Student("wangwu",35));
    		Collections.sort(list,new MyComparator());      //List集合进行排序操作
    		
    		for (int i = 0; i < stu.length; i++) {
    			Student s = stu[i];
    			System.out.println(s);
    		}
    		
    		System.out.println("*********");
    		
    		for (int i=0;i<list.size();i++){
    			Student s = list.get(i);
    			System.out.println(s);
    		}
    	}
    }
    
    
    


     

  • 相关阅读:
    Mac zsh: command not found zsh 所有命令在终端失效
    Java根据FreeMarker模板生成Word(doc)文档(带图片)
    2021年Java面试总结——自我篇
    toArray转换踩坑 java.lang.ClassCastException
    并发和并行
    protoBuf3学习
    StringBuffer和StringBuilder区别
    深拷贝和浅拷贝
    从不订购的客户
    使用jenkins遇到的问题汇总
  • 原文地址:https://www.cnblogs.com/itmyhome/p/4131448.html
Copyright © 2011-2022 走看看