6
votes

Trouvez n'importe quel mot dans une phrase

premier post et tout ça. Je suis un programmeur novice.

Quoi qu'il en soit, j'ai été chargé de créer un programme en Java qui prendra une entrée utilisateur sous la forme d'une phrase et d'un mot. Le programme supprime les espaces de la phrase et vérifie si le mot est présent dans la phrase "sans vierge". Cependant, le programme supprime également une lettre de la fin du mot et vérifie si que le mot est présent dans la phrase blanche. Le programme continue de supprimer les lettres du mot jusqu'à ce qu'il n'y ait plus de lettres à supprimer.

De plus, le programme est également censé indiquer l'emplacement du mot, mais il ne peut pas répertorier un emplacement plusieurs fois. Si le programme ne trouve pas le mot entier, il imprime "" mot "n'a pas été trouvé." Si tel est le cas, il imprime "" mot "a été trouvé à l'emplacement" x ""

E.g. Si ma phrase est "elle chante par la rivière" et par mot est "octet", le code est censé vérifier "ShesingsbyTheriver" pour "Byte", "BYT", "BY", et "BY", mais il ne peut pas trouver "BYT", "BY", et "B" au même endroit.

ci-dessous est le code que j'ai. Tout va bien jusqu'à ma déclaration IF. Au lieu de trouver le mot dans la phrase sans réserve, il continue d'imprimer "" mot "n'a pas été trouvé"

Quelques dernières notes: je devrais éviter les tableaux et la plupart des commandes dont j'ai besoin sont en classe de cordes.

merci! xxx


2 commentaires

Ceci est un peu hors sujet, mais vous devez envisager de créer une liste des recherches qui se trouvent et la présentant ceci à l'utilisateur au lieu de spammer l'utilisateur avec des boîtes de dialogue pour chaque recherche trouvée. Enfin, bienvenue à Stackoverflow et félicitations pour faire votre premier post!


@ Smac89 ah droite, ça. Mon professeur a demandé spécifiquement que nous «spamons» l'utilisateur, oublié de mentionner que haha.


3 Réponses :


0
votes

Vous devez envisager pause hors de la boucle si le mot n'a pas été trouvé xxx


1 commentaires

Ah, la chose est, mon professeur n'aime pas non plus les déclarations de pause. Il affirme qu'il conduit à un mauvais code. Personnellement je suis en désaccord.



1
votes

Quelques commentaires:

La déclaration si (phraseblankless.tolowercase (). Contient (Word.Tolowercase ())) ne prend pas en compte que vous recherchez une version plus courte de mot à chaque fois. Au lieu de simplement afficher une version abrégée à l'utilisateur dans votre boîte de dialogue, vous pouvez frapper plutôt le mot plus court sur chaque itération: xxx

mais que va casser votre pour boucle.

qui me conduit à commenter # 2. Vous pouvez aussi facilement cela comme un tandis que boucle: xxx

comme pour ne pas pouvoir trouver le même mot au même endroit plusieurs fois. , c'est un peu plus délicat. Probablement le moyen le plus simple de le faire serait avec un tableau de Boolean S, avec chaque élément de tableau représentant un index dans la chaîne: xxx

par défaut primitif booléen à False . Donc, chaque fois que vous trouverez l'instance de la sous-chaîne à une position, vous définissez le drapeau de votre tableau.

Ensuite, vous devez vérifier le tableau à chaque fois que vous recherchez le Word , et s'il a déjà été trouvé, essayez la recherche de nouveau mais commencez par position cette fois . Si vous avez déjà couvert la récursion, c'est un bon moment pour la pratique. Ceci est un peu de code pseudo (car je ne vais pas faire vos devoirs complètement) qui montre comment j'approcherais cela: xxx

Soyez conscient de la mise à jour de la matrice de drapeau, et la sous-chaîne spécifique que vous devez transmettre dans la méthode récursive.


1 commentaires

L'as tu essayé? Cela a-t-il fonctionné? L'idée de méthode récursive est uniquement de traiter si l'entrée de mot a déjà été trouvée à cette position. La boucle pour raccourcir le Wordinput ne devrait pas être à l'intérieur de cette méthode, elle devrait l'appeler. Revenez et examinez la portée variable, et voyez si vous pouvez savoir pourquoi vous ne pouvez pas déclarer le tableau booléen à l'intérieur de la méthode. Meilleur conseil, insérez quelques déclarations d'impression libéralement dans votre code pour l'exécuter et voir ce que cela fait.



1
votes

Votre problème est qu'il est toujours cherché si "octet" a été trouvé et non des soustractions d'octets.

Cela se produit sur cette ligne p> xxx pré>

vous utilisez toujours mot code> qui est toujours "octet", il n'est jamais mis à jour. P> Vous pouvez donc le remplacer par p> xxx pré>

mais je ne le recommanderais pas. Au lieu de cela, essayez de mettre à jour le mot sur chaque itération de la boucle de la boucle pour. P>

afin que vous puissiez faire: p> xxx pré>

Votre finale de boucle serait: p>

for (int x = 0; x < word.length(); x++)
{
    word = word.substring(0, word.length() - x);
    if (sentenceBlankless.toLowerCase().contains(word.toLowerCase()))
    {
        int loc = sentenceBlankless.toLowerCase().indexOf(word.toLowerCase());
        JOptionPane.showMessageDialog(null, word + " was found at location " + loc);
    }
    else
        JOptionPane.showMessageDialog(null, word + " was not found");

}


3 commentaires

J'ai essayé votre suggestion et je sors des erreurs de limites. Qui est bizarre parce que je n'ai pas joué avec les longueurs de la corde


EDIT: Erreur de ma part, essayé d'imprimer le mot avec (Word.Substring (0, Word.Length () - x) en plus d'avoir cela dans la boucle.


Oh ouais, j'aurais dû mentionner que j'ai aussi changé cette partie. Aussi à ne pas imprimer deux fois au même endroit, vous pouvez utiliser un hashmap, cependant, je ne savais pas comment votre instructeur veut que vous le résolvez.