3

複数のフィールドの1つだけに基づいてオブジェクトのリストを並べ替える方法を探していました(そして、自分で質問することになりました)が、私の調査では、次の答えに出くわしました。

https://stackoverflow.com/a/1421537/1549672

私はJavaにかなり慣れていないので、これが理由かもしれませんが、この最後の方法を完全には理解していません。

public static Comparator<Person> getComparator(final PersonComparator... multipleOptions) {
    return new Comparator<Person>() {
        public int compare(Person o1, Person o2) {
            for (PersonComparator option : multipleOptions) {
                int result = option.compare(o1, o2);
                if (result != 0) {
                    return result;
                }
            }
            return 0;
        }
    };
}

誰かがそれがどのように機能するかを説明してもらえますか...そしてそれは正確に何をしますか?ありがとう!

4

5 に答える 5

4

「equals」を返さない最初のコンパレータを見つけてその値を返します。それ以外の場合は「equals」を返します。

実際には、Comparator-interfaceに基づいて匿名クラスを作成することにより、これを行うための新しいComparatorが作成されます。

public static Comparator<Person> getComparator(
   final PersonComparator... multipleOptions) 
{        
    return new Comparator<Person>() { //create anonymous class 
        public int compare(Person o1, Person o2) { //which implements the only method 
                                                   //in Comparator
            for (PersonComparator option : multipleOptions) { //loop through given 
                                                              //comparators
                int result = option.compare(o1, o2);
                if (result != 0) {                         //return value of the first
                    return result;                         //which says "non-equal"
                }
            }
            return 0;//all said "equals" so we say "equals"
        }
    };
}
于 2012-08-02T21:28:37.967 に答える
1

Comparatorを使用して2人のオブジェクトを比較しています。

順序について2つの引数を比較します。最初の引数が2番目の引数よりも小さい、等しい、または大きい場合、負の整数、ゼロ、または正の整数を返します

于 2012-08-02T21:27:57.013 に答える
1

getComparatorPersonメソッドは、引数で渡されたコンパレータに基づいて2つのオブジェクトを比較するコンパレータを返します。sのそれぞれはPersonComparator、たとえば、Personクラスフィールドの1つによってPersonを比較するように設計されています。

  • PersonComparator.ID_SORTPersonオブジェクトをid(0 <1 <2 <3 <...)で比較します
  • PersonComparator.NAME_SORT自然な(辞書の)順序( "a" <"aa" <"ab" <"b")を使用して、名前でPersonオブジェクトを比較します。

Personクラスにさらにフィールドがある場合は、列挙型に新しいコンパレータを追加できますPersonComparator

また、メソッドに渡されるPersonComparatorsの順序もgetComparator重要です。
たとえば、人がいる場合

Person p1 = new Person(1,"Jack");
Person p2 = new Person(2,"Jack");
Person p3 = new Person(2,"Adam");

コンパレータを作成します

getComparator(PersonComparator.ID_SORT,PersonComparator.NAME_SORT) 

最初に人をidsで並べ替え、idsが等しい場合は、名前で並べ替えます

(1,"Jack") (2,"Adam") (2,"Jack")

また、によって作成されたコンパレータ

getComparator(PersonComparator.NAME_SORT, PersonComparator.ID_SORT) 

最初に名前を比較し、名前が等しい場合にのみPersonsのIDを比較するため、この方法で人物を並べ替えることができます

(2,"Adam") (1,"Jack") (2,"Jack")

于 2012-08-02T22:06:28.757 に答える
0

基本的に、このメソッドは可変数のPersonComparatorオブジェクトを受け取り、それらを反復処理して2つのPersonオブジェクトを比較し、2つの指定されたPersonオブジェクト間の一致を返さない最初のコンパレータを返します。

于 2012-08-02T21:31:46.593 に答える
0

他のコンパレータのリストfinal PersonComparator... multipleOptionsをメソッドに渡しますgetComparator

コンパレータはこのPersonComparatorsをforループで使用し、現在のPersonComparatorが原因で人が等しくない場合に結果を返します。

したがって、基本的に、このメソッドはComparatorを返します。これは、渡されたすべてのコンパレーターが原因でPersonsが等しい場合、または渡されたコンパレーターcompareToメソッドから最初に一致しないintを返す場合に0を返します。

于 2012-08-02T21:33:30.527 に答える