Чтение файла для создания головоломки поиска слов в массиве 2d и решения

Итак, для этого проекта у меня есть текстовый файл в следующем формате:

4 4
boba
cduf
engt
tach
aunt
bob
cat

Первая строка предназначена для размеров головоломки поиска слов. Я создаю массив 2d символов такого размера, чтобы хранить головоломку. Затем мне нужно прочитать каждый символ из следующих 4 строк, в данном случае, в мой массив. После этого я должен решить головоломку, выполнив поиск любых слов, которые находятся под созданной мной головоломкой, в данном случае это будут тетя, боб и кошка.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;

public class WordPuzzleSolver {
    private char[][] puzzle;
    private String word;
    private LinkedList<String> words;
    private int index = 0;

    public void readFile(File inFile) {
        try{
            FileReader read = new FileReader(inFile);
            BufferedReader reader = new BufferedReader(read);
            String[] dimensions = reader.readLine().split(" ");

            puzzle = new char[Integer.parseInt(dimensions[0])][Integer.parseInt(dimensions[1])];

            for(int i = 0; i < puzzle[0].length; i++){
                String val = reader.readLine();
                puzzle[i] = val.toCharArray();
            }
            words = new LinkedList<String>();
            word = reader.readLine();
            while(word != null){
                words.add(word);
                word = reader.readLine();
            }

            while(index < words.size()){
                solvePuzzle();
                index++;
            }
            reader.close();
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    public void solvePuzzle() {
        char firstLetter = words.get(index).charAt(0);

        for(int i = 0; i < puzzle.length; i++){
            for(int j = 0; j < puzzle[i].length; j++){

                if(puzzle[i][j] == firstLetter){

                    if(checkUp(i, j, words.get(index))){
                        print(words.get(index), i, j, "U");

                        //System.out.println("the word found:"+word);
                    }
                }
            }
        }
    }

    private boolean checkUp(int i, int j, String word){

        int index = j;
        for(char letter : word.toCharArray()){

            if(index >= puzzle[i].length){
                return false;
            }

            if(puzzle[i][index] != letter){
                return false;
            }

            index++;
        }
        return true;
    }

Я делаю что-то не так с чтением в моем файле, но я не могу понять, что. Потому что прямо сейчас, когда я пытаюсь вызвать char firstLetter = word.charAt(0); в моем методе solvePuzzle(), я получаю NullPointerException. Это моя основная проблема, но после того, как я заработал, я не уверен, правильно ли написан мой метод checkUp. Мне все еще нужно написать вспомогательные методы для других 7 возможных направлений, но я хотел сначала использовать этот в текстовом файле, где единственное слово, которое нужно решить, находится в этом направлении.

Вот текущая трассировка стека, которую я получаю:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.LinkedList.checkElementIndex(Unknown Source)
    at java.util.LinkedList.get(Unknown Source)
    at WordPuzzleSolver.solvePuzzle(WordPuzzleSolver.java:43)
    at WordPuzzle.solve(WordPuzzle.java:77)
    at WordPuzzle.actionPerformed(WordPuzzle.java:95)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

последняя строка, которая вызывается перед тем, как выдается ошибка, - это когда я вызываю char firstLetter = words.get(index).charAt(0);


person Frank    schedule 10.02.2016    source источник
comment
Не могли бы вы опубликовать трассировку стека, потому что, насколько я вижу, немного странно, что char firstLetter = word.charAt(0); выдает исключение NullPointerException, когда вы проверяете, что word не является нулевым в цикле while. (Кроме того, я заметил одну неуместную ошибку в вашем коде: for(int i = 0; i < puzzle[i].length - 1; i++){ должно быть for(int i = 0; i < puzzle.length; i++){ (то есть puzzle.length вместо puzzle[i].length; и не - 1, так как вам нужны индексы 0, 1, 2 и 3 (четыре слова); вместо 0, 1 и 2. ) Это не имеет отношения к вашему исключению NullPointerException.   -  person Kevin Cruijssen    schedule 10.02.2016
comment
Я отредактировал свой код выше на код, который был опубликован ниже, с некоторыми незначительными изменениями вместе с очередью стека, так как я все еще получаю эту ошибку и не могу понять, почему. Я распечатывал свой связанный список слов, чтобы убедиться, что он заполняется соответствующими словами, что и было, поэтому я не знаю, почему я все еще получаю исключение нулевого указателя.   -  person Frank    schedule 10.02.2016


Ответы (1)


Я работал над вашим кодом. Ниже рабочий код

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class WordPuzzleSolver {
    private static  char[][] puzzle;
    public static String word;

    public static void readFile(File inFile) {
        try{
            FileReader read = new FileReader(inFile);
            BufferedReader reader = new BufferedReader(read);
            String[] dimensions = reader.readLine().split(" ");

            puzzle = new char[Integer.parseInt(dimensions[0])][Integer.parseInt(dimensions[1])];

            for(int i = 0; i < puzzle[0].length; i++){
                String val = reader.readLine();
                puzzle[i] = val.toCharArray();
            }
            word = reader.readLine();
            while(word != null){
                solvePuzzle();
                word = reader.readLine();
            }
            reader.close();
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    public static void solvePuzzle() {
        char firstLetter = word.charAt(0);

        for(int i = 0; i < puzzle.length; i++){
            for(int j = 0; j < puzzle[i].length; j++){

                if(puzzle[i][j] == firstLetter){

                    if(checkUp(i, j, word)){
                        print(word, i, j, "U");

                        //System.out.println("the word found:"+word);
                    }
                }
            }
        }
    }

    private static boolean checkUp(int i, int j, String word){

        int index = j;
        for(char letter : word.toCharArray()){

            if(index >= puzzle[i].length){
                return false;
            }

            if(puzzle[i][index] != letter){
                return false;
            }

            index++;
        }
        return true;
    }
person vineeth sivan    schedule 10.02.2016
comment
Это работает для меня. Обновите, если вы не можете получить решение - person vineeth sivan; 10.02.2016
comment
Итак, я внес эти изменения и добавил некоторые свои собственные. У меня не может быть статических методов/переменных в этой программе. У меня все еще возникает та же ошибка. Я также добавил очередь стека вместе с строкой кода, в которой генерируется исключение нулевого указателя. - person Frank; 10.02.2016
comment
@ДэвидДолл. Это не NullPointerException. Это IndexOutOfBoundsException. И, да, это важно. - person Mad Physicist; 10.02.2016
comment
@MadPhysicist, вот что я хотел сказать. Во всяком случае, я не понимаю, почему я получаю это. В моем тестовом файле у меня было только одно слово, которое я искал, которое было бы установлено на 0-й индекс в связанном списке, и моя индексная переменная инициализировалась до 0. - person Frank; 10.02.2016
comment
@ДэвидДолл. # 1, int index = j; - это действительно дерьмовая вещь. # 2, вы не показываете полный код, поэтому я подозреваю, что ошибка может быть в другом месте. - person Mad Physicist; 10.02.2016
comment
@MadPhysicist Да, я понял, что вызывает все ошибки. Все в рабочем состоянии, за исключением того, что мой метод checkUp неправильно проверяет слова в направлении вверх. Пытаюсь сейчас в этом разобраться. - person Frank; 10.02.2016