JAvaリストオブジェクト並べ替えComparableとComparatorの違い

2880 ワード

JAvaでオブジェクトをソートする必要がある場合、このオブジェクトはComparableを実装する必要があります.Comparableインタフェースはソートインタフェースであり、オブジェクトがこのインタフェースを実装するとソートをサポートします.これはjdkにおけるString実装を参照することができる.コードを見てみましょう.
personクラスは、Comparableインタフェースを実現し、年齢別にソートし、年齢が同じ場合は名前別にソートし、StringクラスはComparableインタフェースを実現し、comparareToメソッドを直接呼び出せばよい
public class Person implements Comparable{
	
	private String name;
	
	private int age;
	
        //    
        //set、get  ...
	
	public int compareTo(Person p) {
		// TODO Auto-generated method stub
		if (this.age == p.age) {
			return this.name.compareTo(p.name);
		} else {
			return this.age - p.age;
		}
	}
	
	
}

よびだし
public static void main(String[] args) {
		List list = new ArrayList();
		Person p1 = new Person("A1", 10);
		Person p2 = new Person("A2", 8);
		Person p3 = new Person("A3", 9);
		Person p4 = new Person("A5", 6);
		Person p5 = new Person("A4", 6);
		Person p6 = new Person("A6", 12);
		Person p7 = new Person("A7", 5);
		list.add(p1);
		list.add(p2);
		list.add(p3);
		list.add(p4);
		list.add(p5);
		list.add(p6);
		list.add(p7);
		Collections.sort(list);
		for (Person p : list) {
			String s = p.toString();
			System.out.println(s);
		}
	}

結果:
name:A7;age:5 name:A4;age:6 name:A5;age:6 name:A2;age:8 name:A3;age:9 name:A1;age:10 name:A6;age:12
personクラスがComparableインタフェースを実装していない場合は、外部呼び出しソート時にComparatorインタフェースを使用する必要があります.
public static void main(String[] args) {
		List list = new ArrayList();
		Person p1 = new Person("A1", 10);
		Person p2 = new Person("A2", 8);
		Person p3 = new Person("A3", 9);
		Person p4 = new Person("A5", 6);
		Person p5 = new Person("A4", 6);
		Person p6 = new Person("A6", 12);
		Person p7 = new Person("A7", 5);
		list.add(p1);
		list.add(p2);
		list.add(p3);
		list.add(p4);
		list.add(p5);
		list.add(p6);
		list.add(p7);
		
		//Collections.sort(list);
		
		Collections.sort(list, new Comparator() {

			public int compare(Person p1, Person p2) {
				// TODO Auto-generated method stub
				if (p1.getAge() == p2.getAge()) {
					return p1.getName().compareTo(p2.getName());
				} else {
					return p1.getAge() - p2.getAge();
				}
			}
			
		});
		
		for (Person p : list) {
			String s = p.toString();
			System.out.println(s);
		}
		
		
	}

結果:
name:A7;age:5 name:A4;age:6 name:A5;age:6 name:A2;age:8 name:A3;age:9 name:A1;age:10 name:A6;age:12
インタフェースComparableの実装と外部でのComparatorインタフェースの使用の結果は同じであることがわかります.
まとめ:
相違点:
Comparableは内部比較インタフェースであり、通常、オブジェクトが内部ソートを必要とする場合に直接実装されます.
Comparatorは外部比較インタフェースであり、通常、オブジェクトにソートインタフェースが実装されず、ソートが必要な場合に実装される.
同じ点:
2つの機能は似ていますが、1つは内部で、1つは外部です.