2011-12-26 22 views
2

私は初心者です。hereのコードを理解しようとしています。Javaでコンパレータを実装する

私が理解できないことは、そのクラスStringLengthComparatorでは、2つのオブジェクトを比較する「スケルトン」を形成していることです。String o1、String o2。

ただし、クラスを適用すると、6つの文字列がStringLengthComparatorに渡され、正しい結果が得られます。

私の質問は、2つのオブジェクトだけがクラス内で比較されるとき、どのように来るのですか?6つの文字列が渡されると、正しい結果が得られますか?

明らかに、私はここで何か根本的なものを見逃しているので、これについてのガイダンスは素晴らしいものです。

+0

http://docs.oracle.com/javase/tutorial/collections/algorithms/index.htmlをご覧ください。 – adatapost

答えて

1

私の質問は、2つのオブジェクトだけがクラス内で比較されるとき、どのように来るのですか?6つの文字列が渡されると正しい結果が得られますか?

時で二つの文字列を比較オブジェクトの.compare方法。 Arrays.sortメソッドは、指定されたオブジェクトに複数の.compareを呼び出し、その結果の情報を使用して配列のソートに6のフルセットと異なる文字列を渡します。

+0

驚くべきこと:私が探していたものとまったく同じです。私はmatlab/pythonのバックグラウンドから来たので、これは私には新しいものでした。もう一度ありがとう。 – JasonB

+0

...私はMatlabを話すことができませんが、Pythonでは**同じように動作します**。 Javaの 'Arrays.sort'はPythonの' list'オブジェクトの 'sort'メソッドに似ています。コンパレータオブジェクトは、そのメソッドの(現在は推奨されていない) 'cmp'キーワード引数に渡される呼び出し可能なオブジェクトに似ています。しかし、Javaには '__call__'のようなものはありません。したがって、代わりに特定の名前付き関数が使用されます(使用する名前は' Comparator'インターフェースによって指示されます)。 –

0

私はあなたの混乱を見ます。それは実際には「スケルトン」ではなく、単純にある物と別の物の関係を決定するためのアルゴリズムです。したがって、このソートは、この関係を決定する必要があるときにコンパレータを呼び出します。たとえば、降順ソートを取得するには、コンパレータで関係を逆方向にします。

2

長さやアルファベット順などの並べ替えパラメータを指定するために使用されるコンパレータ(javaのコレクションで使用されます)。デフォルトでは、文字列をアルファベット順に比較します。したがって、2つの文字列を長さComparatorをオーバーライドして長さを比較します。

Arrays.sort(strs, new StringLengthComparator()); 

は比較ですパラメータは文字列の長さになると述べているコンパレータStringLengthComparatorを指定して、配列STRS内の各要素の文字列の配列をソートします。

0

は基本的に、文字列(6列)のアレイは列を一つずつ比較し、最終的にアレイ

0

をソートするStringLengthComparatorを使用するStringLengthComparatorではなくは、Arrays.sortに渡されていない、これはArrays.sortがどのようです実装されました。 look at the Java 6 APIでも構いませんが、自分でsource codeを見るまでは満足できません。ソースコードディレクトリの/jdk/src/share/classes/java/util/Arrays.javaファイルを確認してください。

このメソッドが行っていることは、配列を取得してから、コンパレータを実行してから、そのコンパレータを使用して配列全体に対してマージソートのバージョンを実行することです。このメソッドの性質を完全に把握するには、mergesortを調べるとうまくいくでしょう。

Java 6/7はオープンソースであるため、ここにコードのスニペットを示します。繰り返しますが、mergesortを見ると、なぜこれが動作するのかを見ることができます。


public static <T> void sort(T[] a, Comparator<? super T> c) { 
    T[] aux = (T[])a.clone(); 
    if (c==null) 
     mergeSort(aux, a, 0, a.length, 0); 
    else 
     mergeSort(aux, a, 0, a.length, 0, c); 
} 
1

Javaの内部ソートアルゴリズム(またはそのことについては、ソートアルゴリズム)は、プリミティブ以外のオブジェクトをソートする方法を知っている必要があります。

例えば、Javaはintegersの配列をソートする方法を知っています。なぜなら、それは自然順序付けが確立されているからです。 [aの任意のシーケンス(a、b)の場合、aがbより小さい場合はaの前にaが来る] これは、ユーザーが作成できるすべてのオブジェクトでは当てはまりません。これらのオブジェクトの場合、ソート方法についてはjavaを知らせてください。Comparator.compare()がこの目的のために使用されています。

任意のソートアルゴリズムは、同じタイプのちょうどtwoオブジェクト、2つのパラメータを比較する方法を知っている必要があるとして、あなたはStringLengthComparatorのようなものを作成するとComparator.compare()

1

のために十分である、あなたは開発者が実装します。

int compare(T o1, T o2) 

メソッドComparatorインターフェイスを実装する契約の一部として。任意の2つのオブジェクトが発生した場合は、それぞれ,0、または-1を返します。o1がそれぞれo2より大きい場合、等しい場合、等しい場合、小さい場合。

正しく実装されている場合は、これは任意のソートアルゴリズムは、一般的にquicksort、そのmergesortか、または他のどんなソートルーチンあなたが考えることができ、あなたのコードに差し込まれるのための唯一の要件です。

static void sort(Object[] a, Comparator c) 

あなたはそれ以上の疑問を持っている場合は、JDKのソースをダウンロードして、どのように行うのを参照してください。

Arraysクラスを使用すると、起動時にこのプロパティを使用しています。練習として、BubbleSortアルゴリズムのようなものを書く必要があります。このアルゴリズムは、コンパレータを使って配列をソートします。

関連する問題