比较器

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 比较器的更多相关文章

  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比较器

    导语 本节内容,比较器Comparable是核心内容. 主要内容 重新认识Arrays类 两种比较器的使用 具体内容 Arrays类 在之前一直使用的"java.util.Arrays.so ...

  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. 什么是EAC模型

    在20世纪70年代末,一个心理学学生理查德•班德勒和一个语言学学生约翰•格林德提出了一个EAC模型,即眼睛解读线索.这个模型对不同的感官和思维方式之间进行一些有效的研究, 对于大部分的人来说,左边往往 ...

  2. C# show Environment property info name and value retrieve, Maximize the Console Window based on window resolution

    using System.Reflection; static void ShowEnvironmentInfoDemo() { Type type = typeof(Environment); Pr ...

  3. Java生鲜电商平台-交易对账以及跟商家对账的思考

    Java生鲜电商平台-交易对账以及跟商家对账的思考 说明:对于任何一家电商而言,资金的安全尤为重要,在资金管理过程中,涉及到交易订单的对账以及商家的对账,那i么如何来保证对账的高效与准确呢? 公司在搭 ...

  4. 剑指offer笔记面试题12----矩阵中的路径

    题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径 ...

  5. flex三个对齐属性的记忆方式

    今天在群里聊天有人说 flex的那几个居中属性好难记,时不时都要尝试一下,或者查看一下文档,现在我把我自己的记忆方式分享一下... 1. flex的居中主要是通过这三个属性来实现的: justify- ...

  6. OpenCV:增加和减少图像的亮度,图像的加减法

    首先导包: import numpy as np import cv2 import matplotlib.pyplot as plt def show(image): plt.imshow(imag ...

  7. Pandas处理超大规模数据

    对于超大规模的csv文件,我们无法一下将其读入内存当中,只能分块一部分一部分的进行读取: 首先进行如下操作: import pandas as pd reader = pd.read_csv('dat ...

  8. swoole2——Worker与TaskWorker进程

    1.swoole 的进程模型 swoole是一个多进程模型的框架,当启动一个进程swoole应用时,一共会创建2+n+m个线程,n为worker进程数,m为TaskWorker进程数,1个master ...

  9. Python—创建进程池的方式

    创建进程池 from multiprocessing import Pool import time,os result = [] # 存放所有worker函数的返回值 def worker(msg) ...

  10. LG5003 跳舞的线 - 乱拐弯 线性DP

    问题描述 LG5003 题解 设 \(mx[i][j][0/1]\)代表当前位置.朝向的最大拐弯数,最小同理. 来源为左边和上边. 坑点:起点可能为#. \(\mathrm{Code}\) #incl ...