2016-05-02 12 views
1

CircularSuffixArrayクラスをJavaで実装しようとしています(Suffix array Wikipedia)。私のアプローチでは、Comparatorを実装して各接尾辞の最初の文字を比較する内部クラスを作成し、等しい場合は再帰的に次の文字のためにcompareを呼び出します。このような何か:コンパイラを使用したJavaの円形サフィックス配列

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. "アルゴリズム"が間違っていても、caあなたはなぜこのエラーが出るのか理解してもらえますか?

答えて

0

あなたのアプローチは、私が見るものから大丈夫だと思います。エラーが発生する理由は、intとIntegerを混合しているということです。 Javaでは、配列の場合ではなく、アンボクシング(すなわち、整数から整数への変換)およびボクシング(整数から整数への変換)が自動的に行われます。

あなたが配列クラス(https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html)を見れば、あなたが呼び出すためにしようとしているソート方法を見つけることができます:

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

T []は意味あなたの配列は拡張型である必要があり、そのプリミティブはそうではありません。したがって、int []の代わりにInteger []型の配列を作成する必要があります。

また、length()が定義されているかどうかわかりません。私は、あなたが文字列の長さをしたいと仮定していますので、私は次のメソッドを追加したい:

public int length() { 
    return string.length(); 
} 
+0

私がすることを疑われ...しかし、私はそれがポインタだから整数を使用しないようにしようと、そのサイズがより大きくなりますint(問題はCoursera、Algorithms IIからのもので、最適化は非常に厳しいものです)。私は整数で試してみます。 そして、私はlength()メソッドをコピーするのを忘れていました。ありがとう! – nikolat328

関連する問題