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

Така че създавам пъзел с думи, който наскоро заседнах на проблем с индекс извън границите. Това е решено, но програмата не прави това, което бих искал да прави. Идеята е, че тестовият клас ще отпечата 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). ще се изпълнява само веднъж, тъй като никога повече няма да зададете finished на false във вашия цикъл.   -  person B. Kemmer    schedule 19.05.2015
comment
@B.Kemmer за справка къде трябва да задам finish на 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