`
k_lb
  • 浏览: 834114 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

JAVA 比较器

 
阅读更多

在Array 类中定义了以下的一个方法,可以直接为一个对象数组进行排序

public static void sort(Object[] a)


在sort()方法中强调,如果要想实现对象数组的排序,则所有的元素都必须实现Comparable接口


Comparable 接口

Comparable 接口实际上属于比较器的操作接口,此接口定义如下:

public interface Comparable<T> //接口上使用了泛型

int compareTo(T o){ //定义compareTo()方法,此方法完成排序的

//比较代码

}

}


关于compareTo()方法的返回值有三种类型:

小于:-1

等于:0

大于:1


package org.comparedemo;

import java.util.Arrays;

import org.thisdemo.thisdemo01;

class Student implements Comparable<Student>{ //实现比较器,并指定泛型
	private String name;
	private int stno;
	private int age;
	private double score;
	
	public Student(String name,int stno,int age,double score){
		this.name = name;
		this.stno = stno;
		this.age = age;
		this.score = score;
	}
	
	public String toString(){ //覆写toString 方法
		return "姓名:"+this.getName()+
				"编号:"+this.getStno()+
				"年龄:"+this.getAge()+
				"分数:"+this.getScore();
	}
	
	public void setName(String name){
		this.name = name;
	}
	
	public void setStno(int stno){
		this.stno = stno;
	}
	
	public void setAge(int age){
		this.age = age;
	}
	
	public void setScore(float score){
		this.score = score;
	}
	
	public String getName(){
		return this.name;
	}
	
	public int getStno(){
		return this.stno;
	}
	
	public int getAge(){
		return this.age;
	}
	
	public double getScore(){
		return this.score;
	}

	public int compareTo(Student stu) {
		// TODO Auto-generated method stub
		if (this.getScore()<(stu.getScore())){
			return -1;
		}else if (this.getScore()>(stu.getScore())){
			return 1;
		}else{
			if (this.getAge()<(stu.getAge())){
				return -1;
			}else if (this.getAge()>(stu.getAge())){
				return 1;
			}else {
				return 0;
			}
		}
	}

}

public class CompareDemo01 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Student stu[] = {new Student("吴二",1,20,90.1),
				new Student("张三",2,20,90.1),
				new Student("李四",3,19,75.1),
				new Student("王五",4,18,90.1),
				new Student("赵六",5,20,80.1)};
		Arrays.sort(stu);
		
		for (int i=0;i<stu.length;i++){
			System.out.println(stu[i]);
		}
	}

}



Comparable 排序原理

Comparable 发现compareTo()方法中可以返回三种类型:-1、0、1 ,实际上此种排序就类似于常见到的BT(Binary Tree)排序

现在假设有如下几个数字:7 4 6 1 11 0 9 5 3 ,那么如果使用二叉树排序,则首先应该将第一个元素做为根节点,之后每个元素,如果比第一个元素小,则放在左子树,如果比第一个元素大则放在右子树,依次类推


二叉树完成之后要使用中序遍历的方式完成:左-根-右

排序之后的数据:0134567911

那么此时,实际上就可以通过此种代码并结全Comparable 接口来实现一个二叉权的算法


需要注意,String 类型或 Integer 类型的数据都可以使用Comparable 进行接收


package org.comparedemo;

public class ComparableDemo03 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Comparable<String> date = "hello";
		System.out.println(date);
	}

}


package org.comparedemo;

class BinaryTree {
	class Node{
		private Comparable data; // 保存操作的数据内容
		private Node left;
		private Node right;
		
		public Node(Comparable<?> date){
			this.data = date;
		}
		
		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.println(this.data);// 找到根内容
			if (this.right != null){ //存在右子树
				this.right.printNode(); //继续找到下面的右子树
			}
		}
	}
	
	private Node root; // 根节点
	
	public void add(Comparable date){ //接收数据
		Node newNode = new Node(date);
		
		if (this.root == null){ //没有根节点
			this.root = newNode; //第一个节点作为根节点
		}else{
			this.root.addNode(newNode);
		}
		
	}
	
	public void print(){ //输出
		this.root.printNode();//输出全部的节点
	}
}

public class ComparableDemo02 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BinaryTree bt = new BinaryTree();
		bt.add(3);
		bt.add(5);
		bt.add(1);
		bt.add(0);
		bt.add(1);
		bt.add(9);
		bt.print();
	}

}



另一种比较器:Comparator

Comparable 接口在使用的时候直接在类中实现即可,那么如果现在一个类已经开发完成了,则肯定不能再去修改,所以,此时为了让此类也具备排序的功能,可以使用Comparator 接口中完成排序的操作


在Arrays类中提供了以下的ic 排序方法:

public stat<T> void sort(T[] a,Comparator<? super T>c)


Student 类:

package org.comparedemo;

class Student { //实现比较器,并指定泛型
	private String name;
	private int stno;
	private int age;
	private double score;
	
	public Student(String name,int stno,int age,double score){
		this.name = name;
		this.stno = stno;
		this.age = age;
		this.score = score;
	}
	
	public boolean equals(Object obj){ //覆写equals 完成对象的比较
		if (this == obj){
			return true;
		}
		
		if (!(obj instanceof Student)){
			return false;
		}
		
		Student stu = (Student) obj; //向下转型
		
		if (this.stno == stu.stno && this.name.equals(stu.name)
				&& this.age == stu.age && this.score == stu.score){
			return true; //对象相等
		}else{
			return false; //对象不等
		}
		
	}
	
	public String toString(){ //覆写toString 方法
		return "姓名:"+this.getName()+
				"编号:"+this.getStno()+
				"年龄:"+this.getAge()+
				"分数:"+this.getScore();
	}
	
	public void setName(String name){
		this.name = name;
	}
	
	public void setStno(int stno){
		this.stno = stno;
	}
	
	public void setAge(int age){
		this.age = age;
	}
	
	public void setScore(float score){
		this.score = score;
	}
	
	public String getName(){
		return this.name;
	}
	
	public int getStno(){
		return this.stno;
	}
	
	public int getAge(){
		return this.age;
	}
	
	public double getScore(){
		return this.score;
	}


}


StudentComparator 类:


package org.comparedemo;

import java.util.Comparator;

public class StudentComparator implements Comparator<Student> {

	@Override
	public int compare(Student stu1, Student stu2) {
		// TODO Auto-generated method stub
		if (stu1.getScore()<(stu2.getScore())){
			return -1;
		}else if (stu1.getScore()>(stu2.getScore())){
			return 1;
		}else{
			if (stu1.getAge()<(stu2.getAge())){
				return -1;
			}else if (stu1.getAge()>(stu2.getAge())){
				return 1;
			}else {
				return 0;
			}
		}
	}
	
	public boolean equals (Object obj){
		return this.equals(obj);
	}

}


主方法:


package org.comparedemo;

import java.util.Arrays;

public class ComparatorDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Student stu[] = {new Student("吴二",1,20,90.1),
				new Student("张三",2,20,90.1),
				new Student("李四",3,19,75.1),
				new Student("王五",4,18,90.1),
				new Student("赵六",5,20,80.1)};
		Arrays.sort(stu,new StudentComparator());
		
		for (int i=0;i<stu.length;i++){
			System.out.println(stu[i]);
		}
	}

}


分享到:
评论

相关推荐

    JAVA 比较器实例

    本文将通过实例详细讲解Java比较器的概念、使用方法以及其实现原理。 一、什么是Java比较器(Comparator) Java比较器是一个接口,位于`java.util`包下,其主要作用是提供一种方式来定义对象之间的比较规则。当...

    490.488.JAVA基础教程_常用类-Java比较器概述(490).rar

    Java比较器概述是Java编程中的一个重要概念,尤其在数据排序和集合操作中起着关键作用。这个基础教程可能涵盖了以下几个核心知识点: 1. **Comparable接口**:Java中的`Comparable`接口定义了一个`compareTo()`方法...

    Java比较器实现方法项目案例

    Java比较器实现方法项目案例 Java比较器是一种用于实现排序操作的方法,通过比较器可以对对象进行排序。Java中提供了两种比较器的实现方式:Comparable(内部比较器)和Comparator(外部比较器)。 第一种方式是...

    详解Java比较器

    详解 Java 比较器 Java 比较器是 Java 语言中的一种机制,用于比较两个对象的大小。 Java 中的对象正常情况下只能进行比较 == 或者 != 不能使用 &gt; ,但是在实际的开发中,我们需要对多个对象进行排序,就是需要比较...

    计算机后端-Java-Java核心基础-第22章 常用类 20. Java比较器概述.avi

    计算机后端-Java-Java核心基础-第22章 常用类 20. Java比较器概述.avi

    计算机后端-Java-Java核心基础-第23章 枚举类与注解 03. 复习:Java比较器等.avi

    计算机后端-Java-Java核心基础-第23章 枚举类与注解 03. 复习:Java比较器等.avi

    JAVA_比较器讲解

    本教程将深入探讨Java比较器的概念、用法以及如何创建自定义的比较器。 1. 概念理解: - `Comparator`接口位于`java.util`包下,它包含了一个方法:`int compare(T o1, T o2)`,用于比较两个对象的大小关系。 - ...

    java比较器的常见用法.pdf

    除了`Comparable`接口,Java还提供了一个`Comparator`接口,用于创建自定义比较器。`Comparator`可以用于任何对象的比较,而不仅仅限于实现了`Comparable`接口的对象。通过实现`Comparator`接口的`compare()`方法,...

    java比较器的常见用法[借鉴].pdf

    理解并熟练掌握这两种比较器的用法,对于编写高效、灵活的Java代码至关重要。通过实现`Comparable`接口,可以确保类的实例具有清晰的自然顺序,而`Comparator`则提供了额外的排序灵活性,尤其适用于多维度比较或者...

    java文本比较器.rar

    "java文本比较器"是一个这样的工具,它可以帮助开发者高效地完成这项工作。这个压缩包文件“java文本比较器.rar”很可能包含了一个用于比较Java源代码文件的实用程序。 文本比较器的基本原理是通过算法来分析两个...

    java对象比较器

    ### Java对象比较器详解 在Java编程中,比较对象是一个非常常见的需求,尤其是在排序或查找等操作中。本文将深入探讨一个自定义的Java对象比较器,并解释其工作原理及其实现细节。 #### 1. 概述 给定的代码实现了...

    java笔记.zip

    2020-4-9 java 比较器 2020-4-10 java笔记 枚举类 2020-4-10 java 注解(Annotation) 2020-4-11 Java 集合 2020-4-15 java 泛型 2020-4-18 java IO流 2020-4-19 java 网络编程 2020-4-21 java反射 2020-4-22 java8 ...

    浅谈Java中几种常见的比较器的实现方法

    在Java编程中,比较器(Comparator)是用来比较对象的关键工具,尤其在进行对象数组排序时。本文将深入探讨Java中三种常见的比较器实现方法:覆写`equals()`方法,实现`Comparable`接口以及继承`Comparator`接口。 ...

    java 通用比较类

    为了简化这个过程,Java提供了一种机制,即“比较器”(Comparator),它允许我们自定义对象的比较规则。本文将深入探讨Java中通用比较类的概念、实现方式以及它们在实际编程中的应用。 1. **比较器接口...

    java比较器Comparable接口与Comaprator接口的深入分析

    Java中的比较器主要涉及到两种接口:Comparable接口和Comparator接口,它们在处理对象排序时起着关键作用。 **Comparable接口** Comparable接口是Java.lang包下的一个接口,它只有一个方法:compareTo(T o)。当一个...

    个人写的关于Java笔记,较为全面

    Java 比较器(Java Comparator)是一种接口,用于比较对象。比较器可以用于排序、过滤和搜索对象。 正则表达式 Java 正则表达式(Java Regular Expression)是一种字符串匹配模式,用于匹配和处理字符串。 反射 ...

    DynamicComparator:Java 动态比较器

    在Java编程语言中,`DynamicComparator`是一种实现比较器(Comparator)的方式,它允许在运行时根据特定条件来比较对象。这种技术对于处理多种比较逻辑或者需要灵活改变比较规则的场景非常有用。本文将深入探讨Java...

    java用treemap统计单词出现的个数

    知识点2:Java比较器(Comparator)的使用 在本例中,我们使用了一个自定义的比较器来对TreeMap的键进行排序。Comparator是一个函数式接口,用于比较两个对象的大小。在本例中,我们使用了String类型的compareTo...

    自己用Java写的图像比较器

    自己用Java写的桌面小工具,可以用来做为“大家来找茬”之类小游戏时的辅助工具,详见我的博客

    比较器Java:接口Java的“比较器”功能

    Java上的Interfaz'Comparator' Descripción Projecto que ejemplifica el uso de la interfazgenérica'Comparator',准许持证人tenjet objetos que la Implementen para poder pasar a ser'Comparadores'。 可以...

Global site tag (gtag.js) - Google Analytics