2 votes

Tableau de suffixes circulaires en Java à l'aide d'un comparateur

J'essaie d'implémenter une classe CircularSuffixArray en Java ( Tableau de suffixes Wikipédia). Dans mon approche, j'ai créé une classe interne qui implémente Comparator pour comparer le premier caractère de chaque suffixe et, s'ils sont égaux, appeler récursivement compare pour les caractères suivants. Quelque chose comme ça :

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

Mais lorsque j'ai essayé de le compiler, j'ai obtenu cette erreur :

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

Appelez-moi :

  1. Tout d'abord, si l'implémentation est correcte (je sais qu'il y a beaucoup de codes publiés mais je veux essayer par moi-même).
  2. Peu importe que l'algorithme soit erroné, pouvez-vous m'aider à comprendre pourquoi je reçois cette erreur ?

0voto

Zach Butler Points 99

Je pense que votre approche est bonne d'après ce que je vois. La raison pour laquelle vous obtenez l'erreur, je crois, est que vous mélangez int et Integer. Java effectue un certain nombre d'opérations d'unboxing (c'est-à-dire de conversion des Integers en ints) et de boxing (conversion des ints en Integers) automatiquement, mais pas dans le cas d'un tableau.

Si vous regardez la classe Arrays ( https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html ), vous trouverez la méthode de tri que vous essayez d'appeler :

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

Le T[] signifie que votre tableau doit être un type extensible, ce que les primitives ne sont pas. Vous devrez donc créer votre tableau de type Integer[] au lieu de int[].

Je ne sais pas non plus où est défini length(). Je suppose que vous voulez la longueur de la chaîne, donc j'ajouterais la méthode suivante :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X