Javaのコンパレータ

コンパレータ

配列クラス

主な特長:

  • すべてのツールとの関連操作の配列を完了

バイナリ検索:

  • 注文した数字のバイナリ検索シーケンスで
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()は任意の関係を持っていない、これは配列の配列の比較はオブジェクトではありません等しいです。

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));
    }
}

コンパレータ:匹敵*

オブジェクトの配列をソートします

public static void sort(Object [] a);

配列クラスは、直接オブジェクト配列の並べ替えを達成するためにソート()メソッドを使用することができ

  • テストコード*
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));
    }
}

コンパレータインタフェース(最悪で)

  • インタフェースは、関数インタフェースです:のみ継承されたメソッドということ
@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));
    }
}
  • 違い:

    コンパレータは、特別なクラスが指定されている定義する必要がありますしながら、同等のインターフェース・クラスは、クラス定義の段階で実装されています。

概要

  • ソートは同等のインタフェースを使用し、オブジェクトの配列を含みます
  • 実際の状況に基づいて、マスターのバイナリコード

おすすめ

転載: www.cnblogs.com/wangyuyang1016/p/11109725.html