(Comparable) Comparador comparable

A través del análisis, se puede encontrar que si desea comparar objetos, debe tener un comparador para formular las reglas de comparación, y las reglas de comparación se logran a través de Compareable. Para Comparable, debe tener claro su estructura básica:
 

public interface Comparable<T>{
	/**
	 * 实现对象的比较处理操作
	 * @param o 要比较的对象
	 * @return 当前数据与小于传入的对象返回负数,大于返回整数,等于返回0
	 */
	public int compareTo(T o);
}

Ejemplo: implementación de una operación de clasificación de matriz de objetos personalizada

package 比较器;

import java.util.Arrays;

public class Comparable类 {
	public static void main(String[] args) {
		Person[] data = new Person[] {
				new Person("王五",19),
				new Person("张三",80),
				new Person("李四",41),
				new Person("周一",50)
			};
		Arrays.sort(data);	//进行对象数组的排序
		System.out.println(Arrays.toString(data));	//输出
	}
}


class Person implements Comparable<Person>{
	private String name;
	private int age;
	
	public Person(String name,int age) {
		
		this.name = name;
		this.age = age;
		
	}
	
	//setter、getter略
	public String toString() {
		
		return "【Person类对象】姓名:"+this.name +"、年龄:"+this.age+"\n";
		
	}

	@Override
	public int compareTo(Person per) {
		
		return this.age - per.age;
		
	}
}

[[Persona objeto] nombre: Wang Wu, edad: 19
, [Persona objeto] nombre: Li Si, edad: 41
, [Persona objeto] nombre: Lunes, edad: 50
, [Persona objeto] nombre: Zhang 3. Edad: 80

Solo se necesita un método compareTo () en la clasificación para definir las reglas de clasificación, y luego todo el sistema Java se puede clasificar para el sss real.

 


public class JavaDemo{
	public static void main(String[] args) {
		BinaryTree<Person> binaryTree = new BinaryTree();
		binaryTree.add(new Person("王五",12));
		binaryTree.add(new Person("张三",32));
		binaryTree.add(new Person("李四",22));
		Object[] obj= binaryTree.toArray();
		for (Object obj1 : obj) {
			System.out.println(obj1);
		}
	}
}

class Person implements Comparable<Person>{
	private String name;
	private int age;
	
	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}
	
	//setter
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	//getter
	public String getName() {
		return this.name;
	}
	public int getAge() {	
		return this.age;
	}
	
	public String toString() {
		return "【Person类对象】姓名:"+this.name +"、年龄:"+this.age+"\n";
	}
	
	/**
	 * 覆写compareTo()方法,定义比较规则
	 * @param o	要进行比较的Person对象
	 * @return	当前数据与小于传入的对象返回负数,大于返回整数,等于返回0
	 */
	@Override
	public int compareTo(Person o) {
		return this.age - o.age;
	} 
	
}

/**
 * 实现二叉树操作
 * @param <T>	要进行二叉树的实现,类型 T 必须实现 Comparable 接口,并且这个接口的类型是 T。只有这样,T 的实例之间才能相互比较大小。
 */
class BinaryTree <T extends Comparable<T>>{	
	
	private class Node{
		private Comparable<T> data;	//存放Comparable,可以比较大小。
		private Node parent;	//保存父节点
		private Node left;	//保存左子树
		private Node right;	//保存右子树
		private int left1;
		private int right1;
		
		public Node(Comparable<T> data) {	//构造方法直接负责数据的存储
			this.data = data;
		}
		
		/**
		 * 实现节点数据的适当位置的存储
		 * @param newNode	要存储的新节点
		 */
		public void addNode(Node newNode) {
			if(newNode.data.compareTo((T)this.data) <= 0) {	//比当前节点小
				if(this.left == null) {	//没有左子树
					this.left = newNode;	//保存左子树
					newNode.parent = this;	//保存父节点
				}else {	//需要向左边继续判断
					this.left.addNode(newNode);	//继续向下判断
				}
			}else {	//比根节点数据大
				if(this.right == null) {
					this.right = newNode;	//保存右子树
					newNode.parent = this;	//保存父节点
				}else {
					this.right.addNode(newNode);	//继续向下判断
				}
			}
		}
		
		/**
		 * 实现所有数据的获取处理,按照中序遍历的形式来完成
		 */
		public void toArrayNode() {
			if(this.left != null) {	//左边有数据
				this.left.toArrayNode();	//递归调用
			}
			
			BinaryTree.this.returnData[BinaryTree.this.foot++] = this.data;
			
			if(this.right  != null) {	//右边有数据
				this.right.toArrayNode();
			}
		}
	}
	
	//-----以下为二叉树的功能实现-----
	private  Node root;	//保存的是根节点
	private int count;	//保存数据个数
	private Object[] returnData;	//返回的数据
	private int foot;	//脚标
	
	/**
	 * 进行数据的保存
	 * @param data	要保存的数据内容
	 * @exception NullPointerException	保存数据为空时会抛出异常
	 */
	public void add(Comparable<T> data) {
		
		if(data == null) {
			throw new NullPointerException("保存的数据不允许为null");
		}
		
		//所有的数据本身不具备节点关系的匹配,所以一定要将其包装在Node类之中
		Node newNode = new Node(data);	//保存节点
		
		if(this.root == null) {	//现在没有根节点,则第一个节点作为根节点
			this.root = newNode;
		}else {	//需要为其保存到一个合适的节点,交给Node来分配
			this.root.addNode(newNode);
		}
		
		this.count++;	//保存数据个数
	}
	
	/**
	 * 以对象数组的形式返回全部数据,如果没有数据返回null
	 * @return	全部数据
	 */
	public Object[] toArray() {
		if(this.count == 0) {
			return null;
		}
		this.returnData = new Object[this.count];	//保存长度为数组长度
		this.foot = 0;	//脚标清零
		this.root.toArrayNode();	//通过Node类处理
		return this.returnData;
	}
}

 

Supongo que te gusta

Origin blog.csdn.net/weixin_46245201/article/details/112607601
Recomendado
Clasificación