2016-05-02 8 views
1

Ich versuche, eine CircularSuffixArray-Klasse in Java zu implementieren (Suffix array Wikipedia). Bei meinem Ansatz habe ich eine innere Klasse erstellt, die Comparator implementiert, um das erste Zeichen jedes Suffixes zu vergleichen und, wenn sie gleich sind, rekursiv compare für die nächsten Zeichen aufzurufen. Etwas wie folgt aus:Circular Suffix Array in Java mit Comparator

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()); 
    } 
} 

Aber wenn ich es zu kompilieren versucht, bekomme ich diesen Fehler:

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

Rufen Sie mich sagen:

  1. Vor allem, wenn die Implementierung ist in Ordnung (ich jetzt, dass es eine Menge Code related ist, aber ich will es selbst versuchen)
  2. Egal, der "Algorithmus" ist falsch, ca n hilfst du mir herauszufinden, warum ich diesen Fehler bekomme?

Antwort

0

Ich denke, Ihr Ansatz ist in Ordnung, was ich sehen kann. Der Grund dafür, dass Sie den Fehler bekommen, ist, dass Sie Int und Integer mischen. Java macht einige Unboxing (d. H. Konvertieren von Ganzzahlen in Ints) und Boxen (Konvertieren von Ints in Ganzzahlen) automatisch, aber nicht im Fall eines Arrays.

Wenn Sie die Klasse Arrays zu buchen (https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html), können Sie die Sortiermethode Sie versuchen zu nennen finden:

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

Das T [] bedeutet, dass Ihr Array muss eine ausfahrbare Typ sein, die Primitive sind nicht. Sie müssen also Ihr Array vom Typ Integer [] anstelle von int [] erstellen.

Ich weiß auch nicht, wo length() definiert ist. Ich nehme an, dass Sie die Länge der Zeichenfolge möchten, also würde ich die folgende Methode hinzufügen:

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

Ich vermutete, dass ... Aber ich habe versucht, Integer nicht zu verwenden, weil es ein Zeiger ist und seine Größe größer als ist ein int (das Problem ist von Coursera, Algorithmen II, und sie sind sehr streng mit Optimierungen). Ich werde es mit Integer versuchen. Und ja, ich habe vergessen, die length() Methode zu kopieren. Vielen Dank! – nikolat328