4
import java.util.*;

public class C_2 {
    public static void main(String args[]) {
        String theStrings[] = { "x", "a", "b", "c", "d" };
        List l = Arrays.asList(theStrings);
        Collections.sort(l);                            // line a
        Collections.sort(l, new ThisIsMyThing());       // line b
        System.out.println(l);
    }
}

class ThisIsMyThing implements Comparator {
    public int compare(Object o1, Object o2) {
        String s1 = (String)o1;
        String s2 = (String)o2;

        return -1 * s1.compareTo(s2);
    }
}

C_2クラスが 2 つの異なる手法に基づいて並べ替えを行うことを理解しています。1つは標準でCollections.sort(l); 、もう1つはCollections.sort(l,Comparator<>());このソート方法を理解できません。誰か説明してくれませんか?

4

3 に答える 3

18

Collection.sort(l)の内容が であると仮定しlますComparableCollection.sort(1, Comparator)カスタムコンパレータを使用して の内容を比較しlます。これがあなたがしたことです。ソートの考え方 (sort()メソッドを含む) は、オブジェクトが比較可能でなければならないことを意味しComparableますComparator

、 、などString、多くの Java オブジェクトは既に比較可能であることに注意してください。それらのために、あなたはただ使うことができますDateNumberCollection.sort(someList);

Circleクラスがあるとしましょう

public class Circle {
    double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    public double getArea(){
        return radius * radius * Math.PI;
    }
}

100 個Circleのオブジェクトを作成した場合:

ArrayList<Circle> circleList = new ArrayList<>();

for (int i = 0; i < 100; i++) {
    // adds a circle with random radius
    circleList.add(new Circle((int)(Math.random() * 100)));
}

// try to sort the list
Collections.sort(circleList);   //compilation error: must be Comparable

Java はそれらを比較する方法がわからないため、それらを並べ替えることができません。これを Java に伝える必要があります。

public class Circle implements Comparable<Circle> {
    double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    // you MUST override the compareTo method from the Comparable interface
    @Override
    public int compareTo(Circle cirlce){
        if (this.getArea() > circle.getArea())
            return 1;
        else if (this.getArea() == circle.getArea())
            return 0;
        else 
            return -1;
    }

    public double getArea(){
        return radius * radius * Math.PI;
    }
}

Circle クラスのメソッドによりcompareTo()、Java はそれらを比較し、並べ替えることができるようになりました。

今、あなたはこれを行うことができます:

Collections.sort(circleList);
// Yayyy I'm being sorted by the size of my areas!!!!!
于 2013-10-30T13:06:36.630 に答える
1

コンパレータを取る Collections.sort は、提供された Comparator に基づいてリストを並べ替え、その他は自然な並べ替え順序に従います。つまり、カスタムの並べ替え順序に従いたい場合は、このメソッドを使用します。そして、それについて説明することはあまりありません。

説明にはこのリンクを使用してください。

于 2013-10-30T12:59:11.470 に答える
0

コレクションの並べ替えは、 Collections.sort(Collection) を使用して値を並べ替えます。このメソッドは、Comparableインターフェイスを実装する人向けです。このインターフェイスはcompare、要素のペアごとの比較を実行し、要素が比較された要素よりも小さい場合は -1 を返し、等しい場合は 0 を返し、大きい場合は 1 を返すメソッドを定義します。一般的な例は Integer クラスです。

別の方法でソートする場合は、インターフェイスに基づいて独自の実装を定義できます。このComparatorアプローチは、オブジェクトを任意の属性または属性の組み合わせでソートすることです。たとえば、属性 Income および dateOfBirth を持つ Person 型のオブジェクトがある場合、Comparator のさまざまな実装を定義し、必要に応じてオブジェクトを並べ替えることができます。

于 2013-10-30T13:06:11.680 に答える