ホームページ  >  記事  >  Java  >  Javaの比較対象とコンパレータの違い

Javaの比較対象とコンパレータの違い

王林
王林転載
2019-11-27 13:20:312234ブラウズ

Javaの比較対象とコンパレータの違い

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

Comparatorjava.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 サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。