0

我正在测试不同的排序方法(选择、气泡插入),并且我正在尝试同时使用 Comparator。

到目前为止,我有两节课;主要和选择排序。

我的主要看起来像这样:

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您要使用的比较器的实例在哪里。


由于您的 Comparator 没有状态,您可能希望将其分配给静态最终字段。

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

所以现在上面的代码将读取

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

这是您最后一个问题的解决方案。创建两个重载的静态方法,一个带有 Comparator,一个不带,然后还创建一个使用自然顺序的 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 回答