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接口
  • 根据实际情况掌握 二叉树代码

原文地址:https://www.cnblogs.com/wangyuyang1016/p/11109725.html

时间: 2024-11-06 11:44:40

Java 比较器的相关文章

java比较器Comparable接口和Comaprator接口

java的比较器有两类,分别是Comparable接口和Comparator接口. 在为对象数组进行排序时,比较器的作用非常明显,首先来讲解Comparable接口. 让需要进行排序的对象实现Comparable接口,重写其中的compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用java.util.Arrays.sort()来排序对象数组,实例如下: class Student implements Comparable<Student>{ private String n

Java 比较器的用法

第一次写博客,正好在回顾Java的时候用到了比较器,记录一下使用的方法. Java比较器多用于对象数组的排序,主要用到comparable和comparator接口 1.使用comparable接口 首先将需要实现排序对象的类实现comparable接口,实现后覆写comparaTo(T other)方法,在comparaTo方法中写出比较规则,最后调用java.utils.Arrays.sort()方法传入需要比较的对象数组即可排序. 测试如下: 1 import java.util.Arra

java比较器Comparator 使用

PresonDemo package cn.stat.p5.person.demo; public class PresonDemo implements Comparable { private String name; private int age; /** * @param args */ public String getName() { return name; } public void setName(String name) { this.name = name; } publ

java比较器 之compareable 和comparato比较

compareable 测试类import java.util.Set; import java.util.TreeSet; public class Test { public static void main(String[] args) { Set<Person>allset = new TreeSet<Person>(); allset.add(new Person(22,"hjw",20000.0,"论语",50.0)); alls

JAVA比较器:Comparable和Comparator

一.Comparable接口 1.public interface Comparable{ public int compareTo(Object other); } 2.当本对象小于.等于或大于other对象时,相应返回一个小于.等于或大于0的值. 3.若对象不可比较,抛出ClassCastException 4.compareTo()定义的顺序是类的自然顺序,即此排序对类的对象来说是最自然的. 5.equals()定义一种自然相等关系,两个对象相等,返回ture. 6.许多类:String.

java比较器Comparable接口和Comaprator接口的比较

Comparable接口:让自定义的对象具有比较规则 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; /* * Comparable接口:让自定义的对象具有比较规则 * * */ public class ComparableDemo { public static void main(String[] args) { ArrayList<Student> list =

java比较器

1 package com.sun; 2 3 public class ComparatorDemo implements Comparable<ComparatorDemo> { 4 5 private String name; 6 private Integer age; 7 private float score; 8 9 public ComparatorDemo(String name, Integer age, float score) { 10 super(); 11 this.

java比较器的复用

博客主页:http://blog.csdn.net/minna_d 设想这么一种场景:A有N个字段,也有专门对A的比较函数.每一次比较函数,在N多个业务线复用. 那么,问题来了, 突然有一天A多加了一个字段in,而且在原一特定场景中这个字段比其它所有字段的优先级都应该高.在其它场景中又没有影响. 该怎么解决这个问题? 1. 重写原有的所有的Comparator类,重写它们的compare方法.这种方法代价太大,因为N多地方需要 if...else 2. 只正对特定场景新增一个组合之前的compa

java常用类详细介绍及总结:字符串相关类、日期时间API、比较器接口、System、Math、BigInteger与BigDecimal

一.字符串相关的类 1.String及常用方法 1.1 String的特性 String:字符串,使用一对""引起来表示. String声明为final的,不可被继承 String实现了Serializable接口:表示字符串是支持序列化的. 实现了Comparable接口:表示String可以比较大小 String内部定义了final char[] value用于存储字符串数据 String:代表不可变的字符序列.简称:不可变性. 体现: 当对字符串重新赋值时,需要重写指定内存区域赋