Java 比较器
比较器
Arrays 类
主要功能:
- 完成所有与数组有关的操作的工具类
二分查找:
- 在一个有序的数字序列中进行二分查找
public static int binarySearch(数据类型 [] a , 数据类型 key)
案例实现
public class TestDemo {
public static void main(String [] args) throws ParseException {
int date [] = new int [] {1,4,2,5,7,4,3,8} ;
java.util.Arrays.parallelSort(date); // 排序
System.out.println(Arrays.binarySearch(date, 3)); // 二分查找
}
}
数组比较:
public static boolean equals(数据类型 [] a , 数据类型 [] b)
和Object.equals()没有任何关系,本次的arrays中的equals比较的是数组不是对象。
public class TestDemo {
public static void main(String [] args) throws ParseException {
int dateA [] = new int [] {1,4,2,5,7,4,3,8} ;
int dateB [] = new int [] {1,4,2,5,7,4,3,8} ;
System.out.println(Arrays.equals(dateA, dateB));
}
}
比较器:Comparable *
对象数组排序
public static void sort(Object [] a);
Arrays类可以直接利用 sort() 方法实现对象数组的排序
- 测试代码 *
class Book implements Comparable<Book> { //使用比较器
private String title ;
private double price ;
public Book (String title , double price) {
this.title = title ;
this.price = price ;
}
public String toString() {
return this.title + " " + this.price;
}
@Override
public int compareTo(Book o) {
// compareTo 方法由 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 ParseException {
Book books [] = new Book [] {
new Book("java",23),
new Book("python",20),
new Book("php",11),
new Book("C/C++",44)
} ;
Arrays.parallelSort(books);// 排序
System.out.println(Arrays.toString(books));
}
}
要对某个对象进行数组排序,对象所在的类一定要实现 Comparable 接口,覆写compareTo()方法。
二叉树结构:BinaryTree
- 数,是一种比链表更为复杂的概念,本质也属于动态对象数组,但是与链表相比,数更有利于数据进行排序。
数的操作原理
- 选择一个数据作为根节点,而后比根节点小的数据放在根节点左节点,比左节点小的放在根节点的右节点。按照 中序 进行遍历。
class Book implements Comparable<Book> { //使用比较器
private String title ;
private double price ;
public Book (String title , double price) {
this.title = title ;
this.price = price ;
}
public String toString() {
return this.title + " " + this.price;
}
@Override
public int compareTo(Book o) {
// compareTo 方法由 Arrays.sort()方法自动调用
if (this.price > o.price) {
return 1 ;
} else if (this.price < o.price){
return -1 ;
} else {
return 0 ;
}
}
}
class BinaryTree {
private class Node{
private Comparable data ;
private Node left ;
private Node right ;
public Node (Comparable data) {
this.data = data ;
}
public void addNode(Node newNode) {
if (this.data.compareTo(newNode.data) < 0 ) {
if (this.left == null) {
this.left = newNode ;
}else {
this.left.addNode(newNode);
}
}else {
if (this.right == 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 = 0 ;
private Object [] retData;
private int foot;
public void add(Object obj) {
Comparable com = (Comparable) obj ;// 必须转为 Comparable
Node newNode = new Node(com); //创建新的Node节点
if (this.root == null) {
this.root = newNode ;
} else {
this.root.addNode(newNode);
}
this.count ++ ;
}
public Object [] toArray(){
if (this.root ==null) {
return null;
}
this.foot = 0 ;
this.retData = new Object [this.count] ;
this.root.toArrayNode();
return this.retData;
}
}
public class TestDemo {
public static void main(String [] args) {
BinaryTree bt = new BinaryTree();
bt.add(new Book("java",23));
bt.add(new Book("python",20));
bt.add(new Book("php",11));
bt.add(new Book("C/C++",44));
Object obj [] = bt.toArray();
System.out.println(Arrays.toString(obj));
}
}
Comparator接口(下下策)
- 该接口是一个函数式接口:即只有继承方法
@FunctionalInterface
public interface Comparator<T> {
public int compare(T o1 , T o2);
public boolean equals(Object obj);
}
我们可以借助该接口,将没有实现Comparable接口的类,进行改变;
实现该接口,创建一个“工具类”,实现Book类对象的排序需求
class Book {
private String title ;
private double price ;
public Book (String title , double price) {
this.title = title ;
this.price = price ;
}
public String getTitle() {
return title;
}
public double getPrice() {
return price;
}
public void setTitle(String title) {
this.title = title;
}
public void setPrice(double price) {
this.price = price;
}
public String toString() {
return this.title + " " + this.price;
}
}
class BookComparator implements Comparator<Book>{ // 比较器工具
@Override
public int compare(Book o1, Book o2) {
if (o1.getPrice() > o2.getPrice()) {
return 1;
} else if (o1.getPrice() > o1.getPrice()){
return -1;
}else {
return 0 ;
}
}
}
public class TestDemo {
public static void main(String [] args) {
Book books [] = new Book [] {
new Book("java",23),
new Book("python",20),
new Book("php",11),
new Book("C/C++",44)
} ;
Arrays.parallelSort(books,new BookComparator());
System.out.println(Arrays.toString(books));
}
}
区别:
comparable是在一个类定义阶段实现的接口类,而comparator则需要专门定义一直指定的类。
总结
- 涉及到对象数组的排序,就使用Comparable接口
- 根据实际情况掌握 二叉树代码
Java 比较器的更多相关文章
- Java比较器对数组,集合排序一
数组排序非常简单,有前辈们的各种排序算法,再加上Java中强大的数组辅助类Arrays与集合辅助类Collections,使得排序变得非常简单,如果说结合比较器Comparator接口和Collato ...
- java比较器Comparable接口和Comaprator接口
Comparable故名思意是比较,意思就是做比较的,然后进行排序. 1.什么是comparable接口 此接口强行对实现它的每个类的对象进行整体排序.此排序被称为该类的自然排序 ,类的 compar ...
- 黑马----JAVA比较器:Comparable和Comparator
黑马程序员:Java培训.Android培训.iOS培训..Net培训 一.Comparable接口 1.public interface Comparable{ public int compare ...
- java比较器Comparator 使用
PresonDemo package cn.stat.p5.person.demo; public class PresonDemo implements Comparable { private S ...
- java比较器 之compareable 和comparato比较
compareable 测试类import java.util.Set; import java.util.TreeSet; public class Test { public static voi ...
- Java比较器
导语 本节内容,比较器Comparable是核心内容. 主要内容 重新认识Arrays类 两种比较器的使用 具体内容 Arrays类 在之前一直使用的"java.util.Arrays.so ...
- TreeSet的两种实现方法:Comparable和Comparator(Java比较器)
Comparable与Comparator实际上是TreeSet集合的两种实现方式,用来实现对象的排序.下边介绍一下两种比较器的使用方法和区别. Comparable称为元素的自然顺序,或者叫做默认顺 ...
- 小白养成记——Java比较器Comparable和Comparator
一.使用情景 1. 调用Arrays.sort()方法或Collections.sort()方法对自定义类的对象排序 以Arrays.sort()为例.假定有如下自定义的Person类 1 publ ...
- java比较器Comparator
1. 实现比较类 public class Comparator implements java.util.Comparator<TaskInfo>{ @Override public i ...
随机推荐
- 多进程操作-进程队列multiprocess.Queue的使用
一.ipc机制 进程通讯 管道:pipe 基于共享的内存空间 队列:pipe+锁 queue 下面拿代码来实现Queue如何使用: 案例一: from multiprocessing import Q ...
- (转)滑动平均法、滑动平均模型算法(Moving average,MA)
原文链接:https://blog.csdn.net/qq_39521554/article/details/79028012 什么是移动平均法? 移动平均法是用一组最近的实际数据值来预测未来一期或几 ...
- zabbix snmp监控与主被模式
1.snmp基础介绍 snmp全称是简单网络管理协议 为什么要用? 路由器交换机无法安装agent程序,但是都提供snmp服务端, 我们可以使用zabbix的snmp方式监控snmp服务端的数据 2. ...
- Violet音乐社区设计文档
目录 Violet音乐社区设计文档 一.引言 1.1 编写目的 1.2 开发背景 二.用例图设计 2.1游客实例设计 2.2 管理员实例设计 2.3 普通用户实例设计 三.类图设计 3.1 歌手类 3 ...
- Notification 弹出一个通知在桌面右下角
if (!("Notification" in window)) { //alert("This browser does not support desktop not ...
- MySQL学习——管理用户权限
MySQL学习——管理用户权限 摘要:本文主要学习了使用DCL语句管理用户权限的方法. 了解用户权限 什么是用户 用户,指的就是操作和使用MySQL数据库的人.使用MySQL数据库需要用户先通过用户名 ...
- 8. java 面向对象
一.面向对象特征 1. 封装 方法就是一种封装 关键字private也是一种封装 封装就是讲一些逻辑细节信息隐藏起来,对于外界不可见:外界只需调用我即可: 一旦使用了private进行修饰,那么本类当 ...
- Day6 - Python基础6 模块shelve、xml、re、subprocess、pymysql
本节目录: 1.shelve模块 2.xml模块 3.re模块 4.subprocess模块 5.logging模块 6.pymysql 1.shelve 模块 shelve模块是一个简单的k,v将内 ...
- AcWing 901. 滑雪
地址 https://www.acwing.com/problem/content/description/903/ 题目描述给定一个R行C列的矩阵,表示一个矩形网格滑雪场. 矩阵中第 i 行第 j ...
- 洛谷 P5639 【CSGRound2】守序者的尊严
洛谷 P5639 [CSGRound2]守序者的尊严 洛谷传送门 题目背景 由于Y校最近进行了对学校食堂的全面改革与对小卖部的全面整治(乱搞),导致学校小卖部卖的零食被禁售了:学校食堂的炸鸡窗口也消失 ...