匹敵&コンパレータのジャワの基礎

I.概要

この記事ではまず、我々は、関連するプレゼンテーションComparableインタフェースを見て、一例として、それぞれのサブ使用を説明するために来るその後、簡単なコンパレータと同等の使用の2つのJavaインターフェースのソートを比較するためである、と。


二、Comparableインタフェース

まず結論:中国の手段で同等の「同等の」は、つまり、このインタフェースを実装するクラスであるソート可能

例えば、我々は簡単な学生のカテゴリをカスタマイズします。

public class Student {
    
    private int score;   // 学生成绩
    
    private String name; // 学生名字

    public Student(int score, String name) {
        this.score = score;
        this.name = name;
    }
}

2人の学生が同じ名前を得点するとき、我々は今、高いソートに低いから学生のクラスを獲得する必要があるとし、次のように、順序に従ってソートされます。

100 zhangsan
リシ60
wangwu 80
Marckの80

4人の学生ソートした後、以下のように、出力は次のようになります。

60リシ
Marckの80
wangwu 80
zhangsan 100

あなたはとてもワットレターマルク「M」「を開始してから、自分の名前を比較していき、結果がローからハイに順にソートされ、結果が原因マルクのwangwuと80ポイントで見ることができる」ので、wangwuイニシャルよりも小さくなっています先にwangwuのマルク。

だから、どのように我々は道のこの種を定義する必要がありますか?答えは、StudentクラスはComparableインタフェースを実装することです。まずはこのインターフェースは次のように定義された方法を見てみましょう:

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

私たちは、このインタフェースが一つだけ定義されて見ることができcompareTo()、その後、我々はx.compareTo(y)の大きさで、xとyを比較すると仮定し、方法を:

  • この方法は、XがY未満であることを示し、負の返された場合、
  • この方法は、X及びYが等しいことを示し、ゼロに戻った場合、
  • この方法は、正の数を返した場合、xが記載さyより大きくなっています。

次のようにだから我々は、Studentクラスを変換することができます。

public class Student implements Comparable<Student>{

    private int score;

    private String name;

    public Student(int score, String name) {
        this.score = score;
        this.name = name;
    }

    @Override
    public int compareTo(Student s) {
        // 调用方式假设为 x.compareTo(y) 的形式
        // x.score > y.score,返回1
        if (this.score > s.score){
            return 1;
        } else if (this.score < s.score){  // x.score < y.score,返回 -1
            return -1;
        } else {
            // x.score = y.score 时进一步比较 name 的大小排序
            return this.name.compareTo(s.name);
        }
    }
    
    @Override
    public String toString() {
        return this.name + "  " + this.score;
    }

    public static void main(String[] args) {
        Student[] students = new Student[4];
        students[0] = new Student(100, "zhangsan");
        students[1] = new Student(60, "lisi");
        students[2] = new Student(80, "wangwu");
        students[3] = new Student(80, "marck");
        Arrays.sort(students);
        for (Student s : students){
            System.out.println(s);
        }
    }
}

学生のクラスは、上記の変換からわかるように、compareTo()この方法は、第一直接未満0 -1直接リターン0より大きく、性能の大きさを比較します。得点が等しい場合、名前はString型である、と私たちはComparableインタフェースを実現するための文字列が長く持っているので、それはさらに、2つの学生のオブジェクト名を比較しますので、我々は直接それを呼び出すcompareTo()返すメソッド。

我々はそれによって簡単なテスト、作るmainメソッドではArrays.sort()、次のように生徒の方法の配列をソートし、出力結果は以下のとおりです。

60リシ
Marckの80
wangwu 80
zhangsan 100

そして、あなたは我々の結果は予想と一致している見ることができます。

注:アレイがソートされるかどうかは、Arrays.sort()メソッドは、あるCollections.sortリスト()メソッドは、ソートするために使用されるソートされた配列の昇順で、のcompareToの順序を()メソッドの値が決定される返します

上記のこの一節を理解するために、我々は、例を理解するために来る:生徒の成績のランキングのために、高い排気に低いから、私たちの習慣を満たしていない、我々は最後の行の高からに慣れている、そして我々はトップにどのようにする必要があります学生カテゴリは、さらにそれを修正しますか?

実際には非常に単純な、私たちはしたいArrays.sort()、この方法は、子供の頃の到着順にソートされているため、多数の結果がライン上で比較的「小さな」である方法を、修正compareTo()方法は以下の通りです:

@Override
public int compareTo(Student s) {
    // 调用方式假设为 x.compareTo(y) 的形式
    // x.score < y.score,返回1
    if (this.score < s.score){
        return 1;
    } else if (this.score > s.score){  // x.score > y.score,返回 -1
        return -1;
    } else {
        // x.score = y.score 时进一步比较 name 的大小排序
        return this.name.compareTo(s.name);
    }
}

事実では、2つのケースは次のように出力結果である変更後、スワップを行う未満の戻り値よりも大きいことがわかります。

100 zhangsan
Marckの80
wangwu 80
リージ60

我々は最後の並べ替えで高からの結果によると、出力結果を見ることができますが、名前は最大の順に最小のままです。

Comparableインタフェースを要約したものです。

  • 注文することができるインターフェース手段を実装するクラス。
  • compareTo() この方法の場合は、2つのオブジェクトの比較、戻り値が0に等しいが、呼び出し元によって表され、未満のプロセスパラメータより小さい、等しい、より大きい、より大きい方法を定義しています。

三、コンパレータインタフェース

コンパレータは、比較のために同様のツールであることを意味し、コンパレータに翻訳します。私たちは、元学生のカテゴリを再訪します:

public class Student {
    
    private int score;   // 学生成绩
    
    private String name; // 学生名字

    public Student(int score, String name) {
        this.score = score;
        this.name = name;
    }
    
    public int getScore() {
        return score;
    }

    public String getName() {
        return name;
    }
}

学生ソート可能なクラスになるために、達成しながら、私たちは、Comparableインタフェースを実現させcompareTo()、この方法で定義されているサイズの関係を決定する方法を。これは、クラスに匹敵効果以内に達成されます。

私たちはそのComparableインタフェースを実装するためのデザイン部門に考慮していませんが、今、私たちは、これらのオブジェクトをソートする必要がある場合はしかし、その後、私たちは私たちのクラスで同等のツールに相当する、コンパレータコンパレータの使用を考慮することができます最初にすべての私たちはその定義を参照して、外部で定義されたオブジェクト間の関係の大きさを比較します。

public interface Comparator<T> {
    int compare(T o1, T o2);

    boolean equals(Object o);
}

あなたがコンパレータは、我々はそれを実現する必要がある2種類のインタフェースのメソッド定義見ることができるcompare()方法を、equals()すべてのクラスはObjectから継承するための方法は、実装されていない可能性、およびオブジェクトは、デフォルトの提供equals()方法を。次に、キーの比較()メソッドを参照するためには、次のように、その戻り値が定義され、二つのパラメータO1とO2があることがわかります。

  • 戻り値はO1> O2を示し、ゼロよりも大きい場合。
  • 戻り値がゼロ未満である場合、指示O1 <O2。
  • 戻り値は、O1 = O2を示し、ゼロである場合。

次は学生の援助を比較するために、Studentクラスコンパレータを定義します。

public class StudentComparator implements Comparator<Student> {
    @Override
    public int compare(Student s1, Student s2) {
        if (s1.getScore() < s2.getScore()) {
            return 1;
        } else if (s1.getScore() > s2.getScore()){
            return -1;
        } else {
            return s1.getName().compareTo(s2.getName());
        }
    }
}

ここでは、まだ定義される同じ結果名のソート順に到達するために小さなから、降順でのスコアに従ってください。

コンパレータは、外側のクラスベースで比較されることに注意してください、私たちはゲッターを対応するプライベートフィールドに私たちはそれらの値を追加しています。次に我々は、その使用(Comparableインタフェースを実装していない学生のクラス以下の例に注意してください)を参照してください。

public class Test {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>(4);
        students.add(new Student(100, "zhangsan"));
        students.add(new Student(60, "lisi"));
        students.add(new Student(80, "wangwu"));
        students.add(new Student(80, "marck"));
        Collections.sort(students, new StudentComparator());
        for (Student s : students){
            System.out.println(s);
        }
    }
}

ここでは、データの保存の学生のリストの形であり、その後、Collections.sort()メソッドを呼び出すことによってそれらをソートします。出力は次のようになります。

100 zhangsan
Marckの80
wangwu 80
リージ60

私たちは、コンパレータを注文することで同じ効果を得ることができていることがわかります。次に、我々は別の例を取る、プライオリティキュー優先度つきキューは、デフォルトの最小ヒープ最大ヒープフォームから変更しました。

次のように優先度つきキューコンストラクタは、コンパレータのコンパレータを渡すことができます。

public PriorityQueue(Comparator<? super E> comparator);

入ってくるの関係要素の大きさを比較するため、この工法は、プライオリティキューを定義し、デフォルトの実装では、最小限の優先度つきキュープライオリティキューで、その後、私たちは私の考えを変え、次のようにコードは、あなたが最大ヒープを達成することができ、大小関係が逆になります下記:

public static void main(String[] args) {
    PriorityQueue<String> maxHeap = new PriorityQueue<String>(new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            return s2.compareTo(s1);
        }
    });
}

ここでは、例えば、コンパレータの定義では、我々はリターンが直接、要素の文字列型であるs2.compareTo(s1)スタックの最大の効果を達成することができるようになります。


IVの概要

次のように匹敵するとコンパレータのリンクとの違いをまとめました。

  • 同等およびコンパレータインタフェースが定義され、関連するインターフェイスを比較します。
  • インタフェースを実装するクラス「内部」クラスで使用される同等のインターフェースは、ソートのように表されます。
  • 「外部」のクラスで使用されるコンパレータインタフェースは、クラスのComparableインタフェースを実装していない、我々はクラスにコンパレータを提供することで、それらを比較することができます。

おすすめ

転載: blog.csdn.net/qq_38182125/article/details/93849185