Comparable コンパレータ
Comparable は java.lang パッケージの下にあります。これは本質的に内部コンパレータです。Comparable を実装するクラスは、それ自体で比較を実行できます。 、比較結果に関しては、自然な比較メソッドcompareToの実装に依存します。
compareTo の戻り値は -1、0、1 です。コンパレータが比較されるオブジェクトより大きい場合は 1 が返され、等しい場合は 0 が返され、比較されるオブジェクトより小さい場合は -1 が返されます。
Collections.sort
および Arrays.sort
は、Comparable を実装するオブジェクトを自動的に並べ替えることができます。
無料のオンライン学習ビデオの推奨: java 学習
例は次のとおりです。ノード オブジェクトを構築し、ノード オブジェクト間の比較を通じて Comparable の使用法を検証します。
ノード オブジェクトの実装は次のとおりです。
public class Node implements Comparable<Object>{ private int num; private String name; @Override public String toString() { return "num=" + num + " name=" + name; } public Node(int num, String name) { super(); this.num = num; this.name = name; } public Node() { super(); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int compareTo(Object o) { Node node = (Node)o; return this.num - node.getNum(); } }
ご覧のとおり、Node の Comparable インターフェイスを実装し、compareTo メソッドをオーバーライドしました。
最初にテストするために、10 個の Node オブジェクトを作成してリストに追加し、順序を入れ替えます。
public class MyTest { public static void main(String[] args) { List<Node> list = new ArrayList<Node>(); for(int i = 0;i < 10;i++) { list.add(new Node(i,"node")); } //打乱顺序 Collections.shuffle(list); for (Node node : list) { System.out.println(node); } } }
結果は次のように表示されます。
num=7 name=node num=0 name=node num=5 name=node num=9 name=node num=6 name=node num=3 name=node num=4 name=node num=8 name=node num=1 name=node num=2 name=node
出力の順序が崩れました。次に、Collections.sort を使用して並べ替えます。
public class MyTest { public static void main(String[] args) { List<Node> list = new ArrayList<Node>(); for(int i = 0;i < 10;i++) { list.add(new Node(i,"node")); } //打乱顺序 Collections.shuffle(list); Collections.sort(list); for (Node node : list) { System.out.println(node); } } }
Collections.sort は、compareTo メソッドの定義に従って実際に比較します。以前に num の昇順で並べ替えを定義しました。現在の並べ替え結果は次のようになります:
num=0 name=node num=1 name=node num=2 name=node num=3 name=node num=4 name=node num=5 name=node num=6 name=node num=7 name=node num=8 name=node num=9 name=node
Comparator
Comparator
は java.util
パッケージの下にあり、本質的には外部コンパレータです。クラスが内部的に Comparable を実装していない場合、または Comparable を実装しているが比較メソッドが必要なものではない場合は、Comparator の実装を検討できます。 Comparator インターフェースには Compare メソッドがあり、その使用法は Comparable の CompareTo と同じです。
並べ替え順序を制御するには、Comparator を並べ替えメソッドに渡す必要があります。いくつかの並べ替えメソッドの使用法を確認すると、それらのメソッドが Comparator パラメーターに渡せることがわかります。
Collections.sort(List<T> list, Comparator<? super T> c); Arrays.sort(T[] a, Comparator<? super T> c);
以前の Node オブジェクトを変更し、Comparable を実装しなくなりました。
public class Node{ private int num; private String name; @Override public String toString() { return "num=" + num + " name=" + name; } public Node(int num, String name) { super(); this.num = num; this.name = name; } public Node() { super(); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
コンパレータを渡すことで降順ソートを実現しようとします。
public class MyTest { public static void main(String[] args) { List<Node> list = new ArrayList<Node>(); for(int i = 0;i < 10;i++) { list.add(new Node(i,"node")); } //打乱顺序 Collections.shuffle(list); Collections.sort(list, new Comparator<Node>() { @Override public int compare(Node o1, Node o2) { return o2.getNum()-o1.getNum(); } }); for (Node node : list) { System.out.println(node); } } }
結果は次のとおりです。
num=9 name=node num=8 name=node num=7 name=node num=6 name=node num=5 name=node num=4 name=node num=3 name=node num=2 name=node num=1 name=node num=0 name=node
Comparator は逆順比較を実装します。
概要
Comparable は内部コンパレータであり、Comparator は外部コンパレータです。クラスが Comparable インターフェイスを実装していないが、並べ替える必要がある場合は、次のことを考慮できます。コンパレータを使用します。別の観点から見ると、比較アルゴリズムを変更する必要がある場合は、Comparable の実装クラスも変更する必要があるため、Comparable インターフェイスを使用することの結合度は Comparator の結合度よりも大きくなります。
この記事は java クイック スタート コラムからのものです。皆さんも一緒に議論したり学んだりすることを歓迎します。
以上がJavaの比較対象とコンパレータの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。