美文网首页
*比较器类(Comparable)类

*比较器类(Comparable)类

作者: 秋笙fine | 来源:发表于2019-01-27 16:27 被阅读0次

    下面来观察一下Arrays类提供的数组排序方法。
    public static void sort(Object[] a);
    对象数组排序,发现Arrays类里面利用sort可以实现对象数组排序。
    范例:编写测试代码

    package TestDemo;
    
    
    import java.text.SimpleDateFormat;
    import java.util.Arrays;
    import java.util.Calendar;
    import java.util.Date;
    
    
    
    class Book{
        private String title;
        private double price;
        public Book(String title,double price){
            this.title=title;
            this.price=price;
        }
        @Override
        public String toString() {
            return "BookName:"+this.title+"price:"+this.price;
        }
    }
    
    public class TestDemo{
        
        public static void main(String[] args) throws Exception{
            Book books[]=new Book[]{
                new Book("Java", 11.1),
                new Book("JSP",22.2),
                new Book("Android",33.3) };
    
                Arrays.sort(books);
                System.out.println(Arrays.toString(books));
        }   
    
    
    }
    
    
    

    在没有语法错误的情况下 报了以下错误。

    Exception in thread "main" java.lang.ClassCastException: TestDemo.Book cannot be cast to java.lang.Comparable
        at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
        at java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
        at java.util.Arrays.sort(Arrays.java:1246)
        at TestDemo.TestDemo.main(TestDemo.java:32)
    
    

    造成此类异常只有一个原因,两个没有关系的类对象发生了强制性的转换。

    这是由于Arrays下的public static void sort(Object[] a)对象排序方法要求,所有参数必须继承Comparable接口才能使用Arrays.sort()方法。
    对象数组的比较,需要具体的规则(例如按照对象实例属性的价格排序等),规则就由Comparable接口定义
    public interface Comparable<T>{
    public int compareTo(T t);
    }
    实际上String类就是Comparable接口的子类,之前使用的String的compareTo方法就是比较的操作功能。现在我们用CompareTo进行对象比较,方法返回三类数据:1(大于),0(等于),-1(小于)

    范例:使用比较器:

    package TestDemo;
    
    
    import java.text.SimpleDateFormat;
    import java.util.Arrays;
    import java.util.Calendar;
    import java.util.Date;
    
    
    
    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 "BookName:"+this.title+"price:"+this.price;
        }
    
        @Override
        public int compareTo(Book o) {//此方法 Arrays.sort()会自动调用。
            if(this.price>o.price){
                return 1;
            }else if(this.price<o.price){
                return -1;
            }else{
                return 0;
            }
        }
    }
    
    public class TestDemo{
        
        public static void main(String[] args) throws Exception{
            Book books[]=new Book[]{
                new Book("Java", 11.1),
                new Book("JSP",22.2),
                new Book("Android",33.3) };
    
                Arrays.sort(books);
                System.out.println(Arrays.toString(books));
        }   
    
    
    }
    
    
    
    image.png

    的确实现了对象数组按照价格排序。

    实现comparable接口子类(Book类)的comparTo方法由Arrays.sort()自动调用。

    总结:

    以后不管何种情况下,只要是一组对象要排序,对象所在的类一定要实现Comparable接口。

    相关文章

      网友评论

          本文标题:*比较器类(Comparable)类

          本文链接:https://www.haomeiwen.com/subject/tkzgjqtx.html