Word-Puzzle (проблемы с ArrayList)

Итак, я создал Word-Puzzle, в котором недавно застрял из-за проблемы с индексом за пределами. Это было решено, однако программа не делает то, что я хотел бы. Идея заключается в том, что тестовый класс будет печатать 3 слова в массиве, например. [FEN, GNU, NOB] (и да, это настоящие английские слова). Затем проверьте, является ли первая буква каждого объединенного слова словом и т. д., например. FGN, если это так, добавьте его в следующий ArrayList, иначе начните снова. Идеальным выводом будет, например, [FEN, GNU, NOB] [FGN, ENO, NUB]. Однако текущий вывод: [FEN, GNU, NOB] [SOY, SOY, SOY] или [FEN, GNU, NOB] [].

Тестовый класс

public class Test_WordPuzzleGenerator {
	public static void main(String[] args) throws FileNotFoundException {
		
		System.out.println("Test 1: size 3");
		int size = 3;
		Puzzle.WordPuzzleGenerator.generatePuzzle(size);

	}

}
WordGenerator:
public class WordPuzzleGenerator {
static ArrayList<String> wordList = new ArrayList<String>();
public static void generatePuzzle(int size) throws FileNotFoundException {
    ArrayList<String> puzzleListY = new ArrayList<String>();
    ArrayList<String> puzzleListX = new ArrayList<String>();
    String randomXWord;
    String letterSize = "" + size;
    makeLetterWordList(letterSize);
    boolean finished = false;
    while ( !finished ) {
        finished = true;
        puzzleListX.clear();
        puzzleListY.clear();
        for (int i = 0; i < size; i++) {
            int randomYWord = randomInteger(wordList.size());
            String item = wordList.get(randomYWord);
            puzzleListY.add(item);
        }
        for (int i = 0; i < puzzleListY.size(); i++) {
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < puzzleListY.size(); j++) {
                sb.append(puzzleListY.get(j).charAt(i));
            }
            randomXWord = sb.toString();
            if (!wordList.contains(randomXWord)) {
                break;
            }
            puzzleListX.add(randomXWord);
            if (puzzleListX.size() == size){
                finished = false;
            }


        }

    }
    System.out.print(puzzleListY);
    System.out.print(puzzleListX);
}

public static int randomInteger(int size) {
	Random rand = new Random();
	int randomNum = rand.nextInt(size);
	return randomNum;
}



public static void makeLetterWordList(String letterSize) throws FileNotFoundException {

	Scanner letterScanner = new Scanner( new File (letterSize + "LetterWords.txt"));
	wordList.clear();
    while (letterScanner.hasNext()){
		wordList.add(letterScanner.next());
	}
	letterScanner.close();
}
}


person Jackson    schedule 19.05.2015    source источник
comment
Где вы используете i во втором цикле?   -  person ajb    schedule 19.05.2015
comment
@ajb Я не использую I во вложенном цикле for, также, если я изменю .charAt(j) на (i), он только иногда будет печатать 1 правильное слово, в остальные разы он показывает пустой ArrayList. Например, Тест 1: размер 3 [ACE, BAD, SKY][ABS]   -  person Jackson    schedule 19.05.2015
comment
я не понимаю ваш цикл while(!finished). он будет запущен только один раз, так как вы больше никогда не установите в своем цикле значение finish равным false.   -  person B. Kemmer    schedule 19.05.2015
comment
@B.Kemmer B.Kemmer для справки, где я должен установить для завершения в цикле значение false?   -  person Jackson    schedule 19.05.2015
comment
первоначальный вопрос заключался в том, зачем вам вообще зацикливаться на этой позиции, если она запускается только один раз?   -  person B. Kemmer    schedule 19.05.2015
comment
@B.Kemmer Это для проверки ошибок, когда повтор ArrayList неверен. Я обновил код, который может сделать его немного понятнее для вас.   -  person Jackson    schedule 19.05.2015


Ответы (1)


Я думаю, вы запутались с этой переменной finished. Замените условие while на puzzleListX.size() != size, и ваш код должен работать.

person Misha    schedule 19.05.2015