2

以下のコードでは、Collections.sort関数が何をしているのかを理解したいと思います。これはどういう意味ですか

Collections.sort(list, new Comparator() { a complete java function });

これはクラスオブジェクトを意味することは理解していnew Comparator()ますが、ここでの関数ブロックの目的は何であり、Javaでそれを呼んでいます。

ありがとう。

/**
     * Sorts/shuffles the given list according to the current sending queue 
     * mode. The list can contain either Message or Tuple<Message, Connection> 
     * objects. Other objects cause error. 
     * @param list The list to sort or shuffle
     * @return The sorted/shuffled list
     */
    @SuppressWarnings(value = "unchecked") /* ugly way to make this generic */
    protected List sortByQueueMode(List list) {
        switch (sendQueueMode) {

    case Q_MODE_RANDOM:
        Collections.shuffle(list, new Random(SimClock.getIntTime()));
        break;
    case Q_MODE_FIFO:
        Collections.sort(list, 
                new Comparator() {
            /** Compares two tuples by their messages' receiving time */
            public int compare(Object o1, Object o2) {
                double diff;
                Message m1, m2;

                if (o1 instanceof Tuple) {
                    m1 = ((Tuple<Message, Connection>)o1).getKey();
                    m2 = ((Tuple<Message, Connection>)o2).getKey();
                }
                else if (o1 instanceof Message) {
                    m1 = (Message)o1;
                    m2 = (Message)o2;
                }
                else {
                    throw new SimError("Invalid type of objects in " + 
                            "the list");
                }

                diff = m1.getReceiveTime() - m2.getReceiveTime();
                if (diff == 0) {
                    return 0;
                }
                return (diff < 0 ? -1 : 1);
            }
        });
        break;
    /* add more queue modes here */
    default:
        throw new SimError("Unknown queue mode " + sendQueueMode);
    }

    return list;
}

私はついに彼にコンパレーターの理解を得ました。この簡単な例は次のように役立ちます。

 Collections.sort(ls, new Comparator() 
                           {

                            public int compare(Object o1, Object o2) 
                            {
                            String sa = (String)o1;
                            String sb = (String)o2;

                            int v = sa.compareTo(sb);

                            return v;           

                                // it can also return 0, and 1
                            }
                           }    
                    );
4

4 に答える 4

3

これは匿名内部クラスと呼ばれます。
Javaは関数ポインタをサポートしていないため、関数をパラメータとして渡すために使用されます。

于 2012-05-20T03:04:45.000 に答える
2

このCollections.sortメソッドは、パラメーターとして指定されたコレクションをソートします。デフォルトでは、コレクションの自然な順序が使用されます。自然な順序は、コレクション内のオブジェクトによって定義されます。たとえば、Stringsのコレクションがある場合、sortメソッドはこのコレクションを文字列のアルファベット順に並べ替えます。sortメソッドは、アルファベット順にソートする必要があることをどのように認識しますか?クラスでcompareToメソッドを使用しましたString。現在のオブジェクト( )を別のオブジェクトとcompareTo比較し、これら2つのオブジェクトのどちらが先に来るかを決定します。リスト内のすべてのアイテムthisを使用して、正しい順序を決定します。compareTosort

したがって、compareToはオブジェクトの自然な順序を決定します。

自然な順序以外の順序が必要な場合はどうなりますか?文字列のリストをアルファベットの逆順に並べ替えたいとしましょう。

これは、sortメソッドの別の(オーバーロードされた)バリアントによって実行できます。このバリアントは、Comparatorインターフェースのインスタンスである2番目のパラメーターを受け入れます。

したがって、 Comparatorを実装する独自のクラスを作成する必要があります。そのため、独自のcompareToメソッドがあります。次に、sortメソッドは、コレクション()のオブジェクトではcompareToなく、これを使用します。compareToString

だからあなたは言う

class MyStringComparator<String> implements Comparator
{
    public int compareTo(String a, String b)
    {
        return a.compareTo(b) * -1; //Reverse the order. 
                                    //The logic can be as complex as your need is
    }
}

その後

MyStringComparator myStringComparator = new MyStringComparator();
Collections.sort(myStringList, myStringComparator);

また

Collections.sort(myStringList、new MyStringComparator(););

オブジェクトの順序を参照してください

この場合MyStringComparatorにのみを使用する場合は、別のクラスを作成して、名前やファイルなどを指定する必要はありません。必要なのは、並べ替え後に忘れることができる一時的なものだけです。

したがって、すべてのコードを記述する代わりに、次のように言うことができます。

Collections.sort(myStringList, new Comparator()
                               {
                                   public int compareTo(String a, String b)
                                   {
                                       return a.compareTo(b) * -1; 
                                   }
                               }
               );

ほら、2番目のパラメーターはクラス定義自体です。

これは匿名内部クラスと呼ばれます。そのような状況のための一種の使用とスロークラス。Swingイベントハンドラーには多くの匿名内部クラスが表示されます。

于 2012-05-20T05:58:31.360 に答える
1

あなたがしているのは、名前を付けずに独自のクラスを定義することです。つまり、匿名のクラスです。このクラスextends Comparatorは、と同じですComparatorが、変更または追加されたものがあります(クラスを拡張するときに変更または追加されたものがあることは必須ではありませんが、クラスを拡張する予定がない場合は、クラスを拡張してもあまり意味がありません何かを変更)。

この場合、匿名クラスには、と呼ばれる独自のメソッドがあります。このメソッドはcompare、2つのオブジェクトを比較し、どちらが最初に表示されるかを特定する方法を記述します。

次に行うことは、クラスからオブジェクトを作成することnewです。キーワードはそれを行います。

最後に、作成したオブジェクトがに渡されCollections.sortます。これは、当然のことながら、リストを並べ替えますが、匿名クラスによって暗示される順序で並べ替えます。つまり、compare2つのオブジェクトのどちらをリストの最初に表示するかを決定する必要があるときはいつでも、匿名クラス内のメソッドを呼び出します。

于 2012-05-20T05:01:36.913 に答える
1

これは基本的に他の人が言ったことを再ハッシュしていますが、もっと簡単に説明できると思います。

まず:

Collections.sortを取りますComparator。これは、オブジェクトを相互に比較する方法を定義します。あるタイプは、それらの値に基づいて数値的にComparator比較する場合があります。Integer別のタイプは、文字に基づいてアルファベット順にComparator比較する場合があります。String

あなたのComparator比較TupleMessage​​彼らに基づいていreceiveTimeます。

第二に:

Comparatorは、と呼ばれる1つのメソッドを持つインターフェイスcompare(Object, Object)です。Javaでは、匿名クラスの形式でその場でインターフェースの具象クラスを定義できます。

インターフェイスを実装する匿名クラスは、そのインターフェイスのメソッドを「オンザフライ」で定義するだけです(つまり、他のコードの途中で、独自の.classファイルではありません)。あなたの例は単にcompare(Object, Object)その場でメソッドを定義します。

于 2012-05-20T05:32:50.517 に答える