我正在测试不同的排序方法(选择、气泡插入),并尝试同时使用比较器。
到目前为止我有两个类;主要和选择排序。
我的主要内容如下:
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);
}
}
}
我的选择排序如下所示:
public class SelectionSort implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
}
我想做的是在使用选择排序时使用我的比较器。
这怎么可能?
最佳答案
替换这一行:
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) {
<小时/>
这是您最后一个问题的解决方案。创建两个重载的静态方法,一个带有比较器,一个没有,然后还创建一个使用自然顺序的比较器(令人惊讶的是,据我所知,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
}
关于java - 使用数组排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12403092/