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;
}
}