Java: Programme de recherche de mots, qu'est-ce que je fais mal?


Je travaille sur un programme de recherche de mots depuis un moment maintenant. Il prend un fichier texte en entrée tel que:

7 //number of rows
15 // number of columns
mucatpoltqfegkq
hfytpnsdlhcorey
pgrhdqsypyscped
gkagdntorioapje
yerjodxnqzztfmf
hypmmgoronkzhuo
qrtzaulhtgtqaao

Puis cherche le mot que l'utilisateur entre. La lecture du fichier et la création du tableau ont lieu dans une classe distincte.

Maintenant, je dois lui faire trouver les mots horizontalement de gauche à droite, vers le bas et en diagonale du haut à gauche en bas à droite. Ce que j'essaie de faire c'est d'abord de trouver où la première lettre se produit puis de commencer à évaluer le reste du mot à partir de de cette position.

Ce que j'ai fait jusqu'à présent ne fonctionne que parfois. Je suis capable de trouver "cat" verticalement sur la première rangée, mais quand j'essaie de trouver une pizza en diagonale, j'obtiens une erreur hors limites. Je sais que cela signifie que quelque chose va au-delà du tableau, et je sais comment le réparer dans des programmes plus simples(comme une boucle for qui passe par un tableau), mais pas ici.

Je n'ai pas commencé la checkDown méthode car j'aimerais avoir les problèmes que j'ai maintenant compris. Voici mon code:

import java.util.Scanner;

public class WordSearch
{
    private char[][] array;
    private String targetWord;
    private int rowLocation;
    private int colLocation;

    public WordSearch(char[][] inArray)
    {
        array = inArray;
        for (int row = 0; row < inArray.length; row++)
        {
            for (int col = 0; col < inArray[row].length; col++)
            {
                System.out.print(inArray[row][col]);
            }
            System.out.println();
        }
        System.out.println();
    }

    public void play()
    {
        Scanner input = new Scanner(System.in); 
        System.out.println("What word would you like to search for? Type end to quit: ");
        targetWord = input.nextLine();
        System.out.println("Typed in: " + targetWord);
        System.out.println();

        compareFirst(targetWord);

    }

    public void compareFirst(String inWord)
    {
        for (int row = 0; row < array.length; row++)
        {
            for (int col = 0; col < array[row].length; col++)
            {
                if(array[row][col] == inWord.charAt(0))
                {
                    rowLocation = row;
                    colLocation = col;

                    suspectAnalysis();
                }
            }
            System.out.println();
        }
    }

    public void suspectAnalysis()
    {
        checkRight();
        checkDown();
        checkDiagonal();
    }

    public void checkRight()
    {
        for(int i = 1; i < (targetWord.length()); i++)
        {
            if(array[rowLocation][colLocation + i] == targetWord.charAt(i))
            {
                System.out.println(targetWord + " found horizontally at row " + rowLocation + " and column " + colLocation);
            }
        }

    }

    public void checkDown()
    {
        //code goes here
    }

    public void checkDiagonal()
    {
        for(int i = 1; i < (targetWord.length()); i++)
        {
            if(array[rowLocation + i][colLocation + i] == targetWord.charAt(i))
            {
                System.out.println(targetWord + " found diagonally at row " + rowLocation + " and column " + colLocation);
            }
        }
    }

}

, j'apprécierais toute aide. Merci!!!!

Author: Bluasul, 2016-11-11

2 answers

Votre méthode checkDiagonal() va outOfBounds car vous n'avez pas ajouté de condition pour vérifier si vos [rowLocation+i] et [colLocation+i] sont dans les limites du tableau. Ajoutez cette condition et vous serez prêt à partir.

 3
Author: Vaibhav Tiwari, 2016-11-11 06:09:31

Ce que dit le commentaire ci-dessus: if(array[rowLocation][colLocation + i] == targetWord.charAt(i)) semble suspect.

Que se passe-t-il si votre mot est aligné verticalement le long du côté droit de la grille? Vous devriez envisager d'ajouter une instruction if avant celle-ci pour vérifier si [rowLocation + i][colLocation + i] est dans les limites. Sinon, vous pouvez être sûr que le mot n'est pas aligné de cette façon (que ce soit dans votre fonction checkRight() ou checkDiagonal()) et vous pouvez quitter la boucle et revenir de la fonction pour vérifier une autre direction.

 1
Author: Chad Lewis, 2016-11-11 05:27:57