Java compareTo()方法的最大值

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

我想实现合并排序,但在这种情况下,我需要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, 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++;
      }
 }