Java compareTo()方法的最大值
我想实现合并排序,但在这种情况下,我需要guard的最大值。我尝试使用null作为最大值,但得到了null指针异常Java compareTo()方法的最大值,java,sorting,Java,Sorting,我想实现合并排序,但在这种情况下,我需要guard的最大值。我尝试使用null作为最大值,但得到了null指针异常 private static <T extends Comparable<? super T>> void merge(T[] A, int p, int q, int r) { T[] L = Arrays.copyOfRange(A, p, q + 1); T[] R = Arrays.copyOfRange(A, q
private static <T extends Comparable<? super T>> void merge(T[] A, int p, int q, int r) {
T[] L = Arrays.copyOfRange(A, p, q + 1);
T[] R = Arrays.copyOfRange(A, q, r + 1);
L[L.length - 1] = null; //guard
R[R.length - 1] = null; //guard
int i = 0;
int j = 0;
// i+j < r - k
for (int k = p; k < r; k++) {
if (L[i].compareTo(R[j]) <= 0) {
A[k] = L[i];
i++;
}
else {
A[k] = R[j];
j++;
}
}
}
private static如果对正值或非常大的值进行排序,则不能使用null,而应使用-1
而不是
L[L.length - 1] = null; //guard
R[R.length - 1] = null; //guard
使用
定义总是返回1的比较器是个坏主意,它不符合比较器的要求
您总是知道防护装置在哪里,因此可以检查索引或检查null。所以只要添加特殊的逻辑,如果元素是保护,它将绕过比较器。
大概是这样的:
for (int k = p; k < r; k++) {
if (R[j] == null || (L[i] != null && L[i].compareTo(R[j]) <= 0)) {
A[k] = L[i];
i++;
}
else {
A[k] = R[j];
j++;
}
}
for(int k=p;k 如果(R[j]==null | | |(L[i]!=null&&L[i].compareTo(R[j]),当我有一个数字时,我可以这样做,但当我有任何类型的对象实现可比接口时,我不能将-1放入T类型。“如何正确地做?”好的,正确的方法是实现一个不需要这样一个保护的算法。我认为你需要提供一个SSCE,这样人们就可以运行你的代码。这不是一个比较器!你认为对象的定义总是更大(compareTo返回1)吗这是个坏主意吗?因为它破坏了compareTo契约。这应该始终是真的yourFakeComparator.compareTo(yourFakeComparator)==0
。
L[L.length - 1] = -1; //guard
R[R.length - 1] = -1; //guard
for (int k = p; k < r; k++) {
if (R[j] == null || (L[i] != null && L[i].compareTo(R[j]) <= 0)) {
A[k] = L[i];
i++;
}
else {
A[k] = R[j];
j++;
}
}