3

我正在尝试在 Java 中实现一个 CircularSuffixArray 类(后缀数组维基百科)。在我的方法中,我创建了一个内部类,Comparator用于比较每个后缀的第一个字符,如果它们相等,则递归调用compare下一个字符。像这样的东西:

public class CircularSuffixArray {
    private String string;
    private int[]  sortSuffixes;

    private class SuffixesOrder implements Comparator<Integer> {
        public int compare(Integer i, Integer j) {
            if      ((length() - 1) < i) return 1;
            else if ((length() - 1) < j) return -1;
            if (string.charAt(i) != string.charAt(j))
                return compare(string.charAt(i), string.charAt(j));
            else
                return compare(i+1, j+1);
        }

        private int compare(char a, char b) {
            return b - a;
        }
    }   

    private Comparator<Integer> suffixesOrder() {
        return new SuffixesOrder();
    }

    // circular suffix array of s
    public CircularSuffixArray(String s) {
        if (s == null) throw new NullPointerException("null argument");
        string = s;
        sortSuffixes = new int[length()];
        for (int i = 0; i < length(); i++)
            sortSuffixes[i] = (length() - 1) - i;
        Arrays.sort(sortSuffixes, suffixesOrder());
    }
}

但是当我试图编译它时,我得到了这个错误:

CircularSuffixArray.java:35: error: no suitable method found for sort(int[],Comparator<Integer>) Arrays.sort(sortSuffixes, suffixesOrder());

打电话告诉我:

  1. 首先,如果实现是好的(我现在有很多相关的代码但我想自己尝试)
  2. 不管“算法”是错的,你能帮我弄清楚为什么我会得到这个错误吗?
4

1 回答 1

0

从我所见,我认为您的方法还可以。我相信你得到错误的原因是你混合了 int 和 Integer。Java 会自动进行一些拆箱(即,将整数转换为整数)和装箱(将整数转换为整数),但在数组的情况下不会。

如果您查看 Arrays 类 ( https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html ),您会发现您尝试调用的排序方法:

sort(T[] a, Comparator<? super T> c)

T[] 意味着您的数组必须是可扩展类型,而原语不是。所以你需要让你的数组类型为 Integer[] 而不是 int[]。

我也不知道 length() 是在哪里定义的。我假设你想要字符串的长度,所以我会添加以下方法:

public int length() {
    return string.length();
}
于 2016-05-02T03:04:32.287 回答