Java学习总结:37(比较器)

比较器

Arrays类

No. 方法 类型 描述
1 public static boolean equals(int [] a,int [] a2) 普通 判断两个数组是否相等,此方法被重载多次,可以判断各种数据类型的数组
2 public static void fill(int [] a,int val) 普通 将指定内容填充到数组中,此方法被重载多次,可以填充各种数据类型的数组
3 public static void sort(int [] a) 普通 数组排序,此方法被重载多次,可以对各种数据类型的数组进行排序
4 public static int binarySearch(int [] a,int key) 普通 对排序后的数组进行检索,此方法被重载多次,可以对各种数据类型的数组进行检索
5 public static String toString(int [] a) 普通 输出数组信息,此方法被重载多次,可以输出各种数据类型的数组

Arrays类中的binarySearch()和sort()方法

例:查找数组内容

package Project.Study.ArrayClass;

import java.util.Arrays;

public class Test1 {
    public static void main(String[]args){
        int data[]=new int[]{1,5,6,7,2,4,3,9,8};
        java.util.Arrays.sort(data);			//数组必须排序才可以查找
        System.out.println(Arrays.binarySearch(data,9));
    }
}
//结果:
//8(排序后的数据索引)

注:binarySearch()方法为二分查找,使用前必须要对目标数组进行排序,如果数组没有排序,则查询到的结果是不确定的。

Arrays类中的equals()方法

例:数组相等比较

package Project.Study.ArraysClass;

import java.util.Arrays;

public class Test2 {
    public static void main(String[]args){
        int data1[]=new int[]{1,2,3,4,5};
        int data2[]=new int[]{1,2,3,4,5};
        int data3[]=new int[]{1,2,3};
        System.out.println(Arrays.equals(data1,data2));	//比较是否相等
        System.out.println(Arrays.equals(data1,data3));
    }
}
//结果:
//true
//false

注意:Arrays类中的equals()方法并不是Object类定义的equals()方法,只是借用了方法名称。使用此方法时,必须保证数组中的数据内容的顺序是一致的。

例:当数据内容顺序不一致时

package Project.Study.ArraysClass;

import java.util.Arrays;

public class Test2 {
    public static void main(String[]args){
        int data1[]=new int[]{1,2,3,4,5};
        int data2[]=new int[]{1,2,3,5,4};
        int data3[]=new int[]{1,2,3};
        System.out.println(Arrays.equals(data1,data2));	//比较是否相等
        System.out.println(Arrays.equals(data1,data3));
    }
}
//结果:
//false
//false

Arrays类中的fill()方法

例:数组填充

package Project.Study.ArraysClass;

import java.util.Arrays;

public class Test3 {
    public static void main(String[]args){
        int data[]=new int[10];
        Arrays.fill(data,3);	//填充数组数据
        System.out.println(data);
        System.out.println(Arrays.toString(data));//将数组变为字符串输出
    }
}
//结果:
//[I@10f87f48
//[3, 3, 3, 3, 3, 3, 3, 3, 3, 3]

比较器:Comparable

上面我们说的排序只是针对普通数组的排序,而对象数组也可以用sort()方法进行排序(public static void sort(Object[]a)),前提是:对象所在的类一定要实现Comparable接口,否则就会出现ClassCastException异常。
该接口定义如下:

public interface Comparable<T>{
	public int compareTo(T o);
}

我们可以看到,Comparable接口中只定义了一个compareTo()方法,此方法返回一个int型数据,而用户覆写此方法时只需要返回3种结果:1、-1、0。

例:实现对象数组排序

package Project.Study.ComparableClass;

import java.util.Arrays;

class Book implements Comparable<Book>{		//实现比较器
    private String title;
    private double price;
    public Book(String title,double price){
        this.title=title;
        this.price=price;
    }
    @Override
    public String toString(){
        return "书名:"+this.title+",价格:"+this.price+"\n";
    }
    @Override
    public int compareTo(Book o){		//Arrays.sort()会自动调用此方法比较
        return Double.compare(this.price, o.price);
    }
}
public class Test1 {
    public static void main(String[]args){
        Book[] book =new Book[]{
                new Book("Java",79.8),
                new Book("C++",69.8),
                new Book("Python",75.8),
                new Book("C",63.8)
        };
        Arrays.sort(book);			//对象数组排序
        System.out.println(Arrays.toString(book));
    }
}
//结果:
//[书名:C,价格:63.8
//, 书名:C++,价格:69.8
//, 书名:Python,价格:75.8
//, 书名:Java,价格:79.8
//]

在上程序中,由于Book类在定义的时候实现了Comparable接口,所以在主类中调用Arrays.sort()方法时,会自动被Book类覆写的compareTo()方法判断对象的大小关系,按照价格由低到高进行排序。

数据结构——BinaryTree

先简单介绍一下树的操作原理:选择第一个数据作为根节点,而后比根节点小的放在根节点的左子树(左节点),比根节点大的数据放在右子树(右节点),取得数据时按照中序遍历的方式取出(左——中——右)。

例:实现二叉树

package Project.Study.BinaryTreeClass;

import java.util.Arrays;

class Book implements Comparable<Book>{     //实现比较
    private String title;
    private double price;
    public Book(String title,double price){
        this.title=title;
        this.price=price;
    }
    @Override
    public String toString(){
        return "书名:"+this.title+",价格:"+this.price+"\n";
    }
    @Override
    public int compareTo(Book o){
        return Double.compare(this.price,o.price);
    }
}
@SuppressWarnings("rawtypes")
class BinaryTree{
    private class Node{
        private Comparable data;        //排序的依据就是Comparable
        private Node left;              //保存左节点
        private Node right;             //保存右节点
        public Node(Comparable data){   //定义构造方法
            this.data=data;
        }
        @SuppressWarnings("unchecked")
        public void addNode(Node newNode){
            if (this.data.compareTo(newNode.data)>0){	//对象数据比较
                if (this.left==null){					//左节点为null
                    this.left=newNode;					//保存左节点
                }else{
                    this.left.addNode(newNode);			//继续判断节点保存位置
                }
            }else{
                if (this.right==null){					//右节点为null
                    this.right=newNode;					//保存到右节点
                }else{
                    this.right.addNode(newNode);		//继续判断节点保存位置
                }
            }
        }
        public void toArrayNode(){						//将节点转换为对象数组
            if (this.left!=null){						//表示有左节点
                this.left.toArrayNode();				//左子树继续取得
            }
            //先判断左节点再取出中间节点数据,再取得右节点数据
            BinaryTree.this.retData[BinaryTree.this.foot++]=this.data;
            if (this.right!=null){						//表示有右节点
                this.right.toArrayNode();				//右子树继续取得
            }
        }
    }
    private Node root;									//定义根节点
    private int count;									//保存元素个数
    private Object[] retData;							//保存返回的对象数组
    private int foot;									//操作脚标
    public void add(Object obj){						//进行数据的追加
        Comparable com=(Comparable)obj;					//转为Comparable才可以实现Node保存
        Node newNode=new Node(com);						//创建新的节点
        if (this.root==null){							//现在不存在根节点
            this.root=newNode;							//保存根节点
        }else{
            this.root.addNode(newNode);					//交给Node类处理
        }
        this.count++;									//保存数据加一
    }
    public Object[] toArray(){							//取得全部保存数据
        if (this.root==null){							//根节点为null
            return null;								//没有数据
        }
        this.foot=0;									//重置脚标
        this.retData=new Object[this.count];			//开辟保存数据数组
        this.root.toArrayNode();						//Node类处理
        return this.retData;							//返回保存的数据
    }
}
public class Test1 {
    public static void main(String[]args){
        BinaryTree bt=new BinaryTree();					//定义二叉树
        bt.add(new Book("Java",79.8));					//保存数据
        bt.add(new Book("Python",75));
        bt.add(new Book("C++",76));
        bt.add(new Book("C",80));
        Object[] obj =bt.toArray();						//将数据转换为对象数组取出
        System.out.println(Arrays.toString(obj));		//利用Arrays类的方法输出
    }
}
//结果:
//[书名:Python,价格:75.0
//, 书名:C++,价格:76.0
//, 书名:Java,价格:79.8
//, 书名:C,价格:80.0
//]

上程序实现了一个可以判断节点大小关系的二叉树数据结构。

挽救的比较器:Comparator

Comparator接口一般用于不能修改类定义时又需要进行对象数组排序的情况下。
该接口定义如下:

@FunctionalInterface
public interface Comparator<T>{
	public int compare(T o1,T o2);
	public boolean equals(Object obj);
}

由该定义我们可以发现,该接口定义了一个compare()方法,此方法的返回3种结果为:1、-1、0.

例:利用Comparator接口实现对象数组排序

package Project.Study.ComparatorClass;

class Book{
    private String title;
    private double price;
    public Book(){}
    public Book(String title,double price){
        this.title=title;
        this.price=price;
    }
    @Override
    public String toString(){
        return "书名:"+this.title+",价格:"+this.price+"\n";
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getTitle() {
        return title;
    }

    public double getPrice() {
        return price;
    }
}
class BookComparator implements java.util.Comparator<Book>{	//假定Book类不能修改,所以为Book类专门设计一个排序的规则类
    @Override
    public int compare(Book o1,Book o2){
        return Double.compare(o1.getPrice(),o2.getPrice());
    }
}
public class Test1 {
    public static void main(String[]args){
        Book[]books=new Book[]{
                new Book("Java",79.8),
                new Book("C++",69.8),
                new Book("Python",75.8),
                new Book("C",63.8)
        };
        java.util.Arrays.sort(books,new BookComparator());
        System.out.println(java.util.Arrays.toString(books));
    }
}
//结果:
//[书名:C,价格:63.8
//, 书名:C++,价格:69.8
//, 书名:Python,价格:75.8
//, 书名:Java,价格:79.8
//]
发布了49 篇原创文章 · 获赞 25 · 访问量 1509

猜你喜欢

转载自blog.csdn.net/weixin_45784666/article/details/105279267