0

さまざまな並べ替え方法(選択、バブル挿入)をテストしており、同時にコンパレータを使用しようとしています。

これまでのところ、2つのクラスがあります。メインと選択ソート。

私のメインは次のようになります。

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String[] anArray = {"Ludo", "matador", "ChessTitan", "Rottefælden"};

        for (int i=0; i<anArray.length-1; i++) {
            for (int j=i+1; j<anArray.length; j++) {
                if (anArray[j].compareTo(anArray[i]) < 1) {

                    String temp = anArray[i];
                    anArray[i] = anArray[j];
                    anArray[j] = temp;

                }
            }

        }

        for (String string : anArray) {
            System.out.println(string);
        }
    }
}

そして私のselectionSortは次のようになります:

public class SelectionSort implements Comparator<String> {

    @Override
    public int compare(String o1, String o2) {      
        return o1.compareTo(o2);
    }
}

私がやりたいのは、選択ソートを使用するときにコンパレータを使用することです。

これはどのように可能ですか?

4

3 に答える 3

2

この行を置き換えます:

if (anArray[j].compareTo(anArray[i]) < 1) {

これとともに:

if (comparator.compare(anArray[j],anArray[i]) < 1) {

ここcomparatorで、は使用するコンパレータのインスタンスです。


コンパレータには状態がないため、静的な最終フィールドに割り当てることをお勧めします。

private static final Comparator<String> COMP = new SelectionSort();

したがって、上記のコードは次のようになります

if (COMP.compare(anArray[j],anArray[i]) < 1) {

これがあなたの最後の質問に対する解決策です。2つのオーバーロードされた静的メソッドを作成します。1つはComparatorを使用し、もう1つは使用せず、次に自然な順序を使用するComparatorも作成します(驚くべきことに、JDKでそのようなものは利用できません)。このようなもの:

private static final Comparator<? extends Comparable> NATURAL_ORDER = new Comparator<Comparable>() {
    @Override
    public int compare(final Comparable o1, final Comparable o2) {
        return o1.compareTo(o2);
    }
};

private static <T> Comparator<T> naturalOrder() {
    return (Comparator<T>) NATURAL_ORDER;
}

public static <T> void sort(final T[] array) {
    if (!Comparable.class.isAssignableFrom(array.getClass().getComponentType())) {
        throw new IllegalArgumentException(
              "Array Component Type must implement Comparable");
    }

    sort(array, naturalOrder());
}

public static <T> void sort(final T[] array, final Comparator<? super T> comparator) {
    // implement sort here
}
于 2012-09-13T09:22:54.233 に答える
0

Arrays.sortを使用できます

Arrays.sort(myArray, myComparator)

次に、必要なコンパレータを渡すことができます。

于 2012-09-13T09:20:47.490 に答える
0

のインスタンスを作成SelectionSortして、比較に使用できます

SelectionSort selectionSort = new SelectionSort();
if (selectionSort.compare(anArray[i], anArray[j]) < 1) {
于 2012-09-13T09:25:14.343 に答える