导语

本节内容,比较器Comparable是核心内容。

主要内容

  • 重新认识Arrays类
  • 两种比较器的使用

具体内容

Arrays类

在之前一直使用的“java.util.Arrays.sort()”可以实现数组的排序,而Arrays类就是java.util包中提供的一个工具类,这个工具类主要是完成所有与数组有关的操作功能。

在这个类里面存在有二分查找法:public static int binarySearch(数据类型[] a, 数据类型 key)。但是如果要进行二分查找,有一个前提,那么就是数组必须是排序后的内容。

范例:实现二分查找

public class TestDemo {
    public static void main(String args[]) {
        int data [] = new int [] {1, 5, 6, 2, 3, 4, 9, 8, 7, 10};
        java.util.Arrays.sort(data);  // 进行排序
        System.out.println(Arrays.binarySearch(data, 9));
    }
}

输出结果

8

Arrays类提供了数组比较:public static boolean equals(数据类型[] a, 数据类型[] a2),只不过借用了equals的方法名称,与Object类的equals()没有关系。

范例:实现二分查找

public class TestDemo {
    public static void main(String args[]) {
        int dataA [] = new int [] {1, 2, 3};
        int dataB [] = new int [] {2, 1, 3};
        int dataC [] = new int [] {1, 2, 3};
        System.out.println(Arrays.equals(dataA, dataB));
        System.out.println(Arrays.equals(dataA, dataC));
    }
}

输出结果

false
ture

要想判断数组是否相同,需要顺序完全一致。

  • 填充数组:public static void fill(数据类型[] a, 数据类型 val)。
  • 将数组变为字符串输出:public static String toString(数据类型[] a)。

范例:使用上面方法

public class TestDemo {
    public static void main(String args[]) {
        int data[] = new int[10];
        Arrays.fill(data, 3);
        System.out.println(Arrays.toString(data));
    }
}

输出结果

[3, 3, 3, 3, 3, 3, 3, 3, 3, 3]

以上实际上就属于数组的基本操作,只不过这样的操作在实际的开发里面很少出现。

比较器:Comparable(核心)

下面来观察一下Arrays类中提供的数组排序方法:public static void sort(Object[] a)。

发现Arrays类里面可以直接利用sort()方法实现对象数组排序。

范例:编写测试代码

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

public class TestDemo {
    public static void main(String args[]) {
        Book books [] = new Book [] {
                new Book("Java开发", 79.8),
                new Book("JSP开发", 69.8),
                new Book("Oracle开发", 99.8),
                new Book("Android开发", 89.8),
        };
        Arrays.sort(books);  // 对象数组排序
        System.out.println(Arrays.toString(books));
    }
}

输出结果

Exception in thread "main" java.lang.ClassCastException:Book cannot be cast to java.lang.Comparable...

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

每一个对象实际上只保留有地址信息,地址里面是有内容的,所以如果是普通的int型数组要进行比较,只要判断大小就够了,但是如果是对象数组,里面包含的如果只是编码(地址)比较是没意义的,就拿上面的代码来讲,应该按照价格排序才是有意义的,所以此处必须要明确地设置出比较的规则:

比较的规则就是由Comparable接口定义的,此接口定义如下:

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

实际上String类就是Comparable接口的子类,之前使用的compareTo()方法就是比较的操作功能,如果用户现在要针对于对象进行比较,建议compareTo()方法返回三类数据:1(大于)、0(等于)、-1(小于)。

范例:使用比较器

/**
 * Java学习交流QQ群:589809992 我们一起学Java!
 */
public 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 to String() {
        return "书名:" + this.title + " 价格:" + 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[]) {
        Book books [] = new Book [] {
                new Book("Java开发", 79.8),
                new Book("JSP开发", 69.8),
                new Book("Oracle开发", 99.8),
                new Book("Android开发", 89.8),
        };
        Arrays.sort(books);  // 对象数组排序
        System.out.println(Arrays.toString(books));
    }
}

输出结果

[书名:JSP开发 价格:69.8, 书名:Java开发 价格:79.8, 书名:Android开发 价格:89.8, 书名:Oracle开发 价格:99.8]

compareTo()方法由Arrays.sort()自动进行调用。

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

挽救的比较器:Comparator

Comparable接口的主要特征是在类定义的时候就默认实现好的接口,那么如果说现在有一个类已经开发完善了。

但是由于初期的设计并没有安排此类对象数组的排序,而后又突然需要实现对象数组的排序,那么这个时候,在不能修改Book类定义的情况下是不能使用Comparable接口的,为此,在Java里面为了解决这个问题,在Java里又出现了另一个比较器:java.util.Comparator。

原本在Comparator接口下有两个方法:

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

而真正要实现的只有compare()方法,需要单独准备出一个类来实现Comparator接口,这个类将作为指定类的排序类。

范例:定义排序的工具类

public class BookComparator implements Comparator<Book> {
    @Override
    public int compare(Book o1, Book o2) {
        if(o1.getPrice() > o2.getPrice()) {
            return 1;
        } else if(o1.getPrice() < o2.getPrice()) {
            return -1;
        } else {
            return 0;
        }
    }
}

之前使用Comparable接口的时候利用的是Arrays类中的sort()方法,可是现在更换了一个接口之后,那么可以使用另外一个被重载的sort()方法:public static <T> void sort(T[] a, Comparator<? super T> c)。

范例:实现排序

public class TestDemo {
    public static void main(String args[]) {
        Book books [] = new Book [] {
                new Book("Java开发", 79.8),
                new Book("JSP开发", 69.8),
                new Book("Oracle开发", 99.8),
                new Book("Android开发", 89.8),
        };
        Arrays.sort(books, new BookComparator());  // 对象数组排序
        System.out.println(Arrays.toString(books));
    }
}

输出结果:

[书名:JSP开发 价格:69.8, 书名:Java开发 价格:79.8, 书名:Android开发 价格:89.8, 书名:Oracle开发 价格:99.8]

使用Comparator比较麻烦,因为要定义一个专门的排序类,而且调用排序的时候也要明确的指明一个排序规则类。

面试题:请解释Comparable和Comparator的区别。

  • 如果对象数组要进行排序那么必须设置排序规则,可以使用Comparable或Comparator接口实现。
  • java.lang.Comparable是在一个类定义的时候要去实现好的接口,这样本类的对象数组就可以进行排序,在Comparable接口下定义有一个public int compareTo()方法。
  • java.util.Comparator是专门定义一个指定类的比较规则,属于挽救的比较操作,里面有两个方法:compare()、equals()。

总结

不管何种情况下,只要牵扯到对象数组的排序大多数使用Comparable接口。

Java学习交流QQ群:589809992 我们一起学Java!

Java比较器的更多相关文章

  1. Java比较器对数组,集合排序一

    数组排序非常简单,有前辈们的各种排序算法,再加上Java中强大的数组辅助类Arrays与集合辅助类Collections,使得排序变得非常简单,如果说结合比较器Comparator接口和Collato ...

  2. java比较器Comparable接口和Comaprator接口

    Comparable故名思意是比较,意思就是做比较的,然后进行排序. 1.什么是comparable接口 此接口强行对实现它的每个类的对象进行整体排序.此排序被称为该类的自然排序 ,类的 compar ...

  3. 黑马----JAVA比较器:Comparable和Comparator

    黑马程序员:Java培训.Android培训.iOS培训..Net培训 一.Comparable接口 1.public interface Comparable{ public int compare ...

  4. java比较器Comparator 使用

    PresonDemo package cn.stat.p5.person.demo; public class PresonDemo implements Comparable { private S ...

  5. java比较器 之compareable 和comparato比较

    compareable 测试类import java.util.Set; import java.util.TreeSet; public class Test { public static voi ...

  6. Java 比较器

    比较器 Arrays 类 主要功能: 完成所有与数组有关的操作的工具类 二分查找: 在一个有序的数字序列中进行二分查找 public static int binarySearch(数据类型 [] a ...

  7. TreeSet的两种实现方法:Comparable和Comparator(Java比较器)

    Comparable与Comparator实际上是TreeSet集合的两种实现方式,用来实现对象的排序.下边介绍一下两种比较器的使用方法和区别. Comparable称为元素的自然顺序,或者叫做默认顺 ...

  8. 小白养成记——Java比较器Comparable和Comparator

    一.使用情景 1.  调用Arrays.sort()方法或Collections.sort()方法对自定义类的对象排序 以Arrays.sort()为例.假定有如下自定义的Person类 1 publ ...

  9. java比较器Comparator

    1. 实现比较类 public class Comparator implements java.util.Comparator<TaskInfo>{ @Override public i ...

随机推荐

  1. Ext.grid.EditorGridPanel分页和查看全部

    在gridPanel添加查看全部数据按钮,必须使得每页显示的数量pageSize为总条数,那么总页数就只会有一页. 1.获取store数据的总条数 var totalCount = grid.getS ...

  2. js、JSP、servlet之间的传递小结

    @ JS 与 JSP :JSP无法直接获取JS的值,只能通过隐藏表单或者dom节点设置. JSP中设置隐藏表单input,或者设置任意一个隐藏或者不隐藏的节点比如div, 而JS就通过document ...

  3. 总结各种排序算法【Java实现】

    一.插入类排序 1.直接插入排序 思想:将第i个插入到前i-1个中的适当位置 时间复杂度:T(n) = O(n²). 空间复杂度:S(n) = O(1). 稳定性:稳定排序. 如果碰见一个和插入元素相 ...

  4. jdbc预编译

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp20 JAVA_JDBC预编译 相关知识点 什么是预编译语句? 预编译语句P ...

  5. 转:【Java集合源码剖析】LinkedHashmap源码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/37867985   前言:有网友建议分析下LinkedHashMap的源码,于是花了一晚上时 ...

  6. 英语学习app案列分析

    很多同学有误解,软件工程课是否就是理论课?或者是几个牛人拼命写代码,其他人打酱油的课?要不然就是学习一个程序语言,搞一个职业培训的课?都不对,软件工程有理论,有实践,更重要的是分析,思辨,总结.在课程 ...

  7. 团队作业4---第一次项目冲刺(ALpha)版本 第五天

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 a.完成所有基础功能 b.正在进行测试调试 四.困难与问题 1.根据测试需求功能,部分基础功能不能实现,性能不达标,后续已完成 ...

  8. 201521123015 《Java程序设计》第3周学习总结

    本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点. 书面作业 Q1.代码阅读 publi ...

  9. Java课程设计—学生成绩管理系统(201521123005 杨雪莹)

    一.团队课程设计博客链接 学生成绩管理系统 二.个人负责模块或任务说明 学生成绩录入 显示所有学生信息 显示各科平均成绩 显示学生成绩(按降序排序) 三.自己的代码提交记录截图 四.自己负责模块或任务 ...

  10. 201521123044 《Java程序设计》第10周学习总结

    1. 本章学习总结 2. 书面作业 本次PTA作业题集异常丶多线程 1.finally题目4-2 1.1 截图你的提交结果 1.2 4-2中finally中捕获异常需要注意什么? 1.无论try-ca ...