2017-02-24 1 views
2

Je ne pense pas que cette question soit très compliquée pour un programmeur expérimenté, mais je suis assez nouveau pour cela. Je me bats. J'ai une liste de délimiteurs déclarés avant une classe Java en tant que tel:JAVA: Comment déterminer l'index du caractère suivant dans une chaîne NON égal à un ensemble de délimiteurs

public static final String DELIMITERS = ",<.>/?;:'\"[{]}\\|=+-_)(*&^%$#@!`~ \t\n"; 

Je voudrais créer une méthode qui prend deux paramètres (un index de départ et une chaîne). Le but est de lire la chaîne et de retourner l'index suivant qui correspond à un caractère NON dans la liste des délimiteurs donnée ci-dessus. Si l'index de départ est un nombre négatif ou supérieur à la longueur du texte, la méthode devrait simplement renvoyer -1. Sinon, il renvoie simplement l'index du caractère suivant NOT dans la liste des délimiteurs. C'est ce que j'ai jusqu'à présent:

public static boolean isDelimiter(char c) { 
    String letter = "" + c; 
    if(DELIMITERS.contains(letter)){ 
     return true; 
    } 
    else{ 
     return false; 
    } 
} 

public static int posNextWord(int startPosition, String text) { 
    boolean isWord = false; 
    int nextWordPosition = 0; 
    if(startPosition < 0 || startPosition > (text.length()-1)){ 
     return -1; 
    } 
    else{ 
     while(isWord = false) { 
      for (int i = startPosition; i < text.length(); i++) { 
       if(!isDelimiter(text.charAt(i))){ 
        nextWordPosition = nextWordPosition + i + startPosition; 
        isWord = true; 
       } 
       else{ 
        isWord = false; 
       } 
      } 
     } 
     return nextWordPosition; 
    } 

} 

}

Quand je lance ce programme avec un échantillon de texte et l'index, cependant, la méthode retourne juste le numéro 0. Toute aide serait tout beaucoup apprécié. En outre, la méthode isDelimiter est requise pour l'utilisation dans la méthode posNextWord().

+0

Afficher la méthode principale où vous appelez 'posNextWord' – nhouser9

+0

Je pense que vous devez' break' après 'isWord = true;' –

+0

Je ne peux pas vraiment; cela fait partie d'une plus grande tâche. Cette méthode est simplement à utiliser avec une méthode similaire (posNextDelimiter()) afin de créer une troisième méthode pour déterminer le nombre de mots d'un ensemble de lignes entrées par l'utilisateur – JBarron

Répondre

2

Ce bloc entier de code est le problème:

while(isWord = false) { 
    for (int i = startPosition; i < text.length(); i++) { 
     if(!isDelimiter(text.charAt(i))){ 
      nextWordPosition = nextWordPosition + i + startPosition; 
      isWord = true; 
     } 
     else{ 
      isWord = false; 
     } 
    } 
} 
return nextWordPosition; 

Tout d'abord, il vous suffit d'une boucle pour vérifier chaque caractère de la boucle. Vous n'avez pas besoin de while et de for. Deuxièmement, si vous voulez trouver le premier char non-correspondant, vous pouvez simplement revenir quand vous le trouvez.

Comme ceci:

for (int i = startPosition; i < text.length(); i++) { 
    if(!isDelimiter(text.charAt(i))){ 
     return i + startPosition; 
    } 
} 
return -1; 
+0

@JBarron Pas de problème, heureux de vous aider! Si cela a résolu le problème s'il vous plaît n'oubliez pas de upvote et accepter =] – nhouser9

1

Voir les commentaires documentés. Ne pas hésiter à demander si on ne sait pas:

public static boolean isDelimiter(char c) { 

    String letter = "" + c; 
    if(DELIMITERS.contains(letter)){ 
     return true; 
    } 
    //else{ this else is not needed 
     System.out.println(letter +" is not a delimiter"); 
     return false; 
    //} 
} 

public static int posNextWord(int startPosition, String text) { 

    //boolean isWord = false; not used 
    int nextWordPosition = 0; 
    if((startPosition < 0) || (startPosition > (text.length()-1))){ 
     return -1; 
    } 
    //else{ this is not needed 
    //while(isWord = false) { 

     for (int i = startPosition; i < text.length(); i++) { 

      if(!isDelimiter(text.charAt(i))){ 
       nextWordPosition = nextWordPosition + i + startPosition; 
       //isWord = true; 
       return nextWordPosition; //as Scary Wombat commented 
      } 
      //else{ 
      // isWord = false; 
      //} 

     } 
     //isWord = false; 
    //} 
    return nextWordPosition; 
    // } 

} 

BTW: Je ne pense pas que ce soit une bonne idée de revenir 0 comme « not found » résultat. 0 peut également être retourné comme position "trouvée" valide.