ArrayList<ArrayList<IndexPosition>> getFindWord(Participant p, String commandText) { commandText = _language.normalizeString(commandText); if (commandText.contains(" ")) return null; final HashMap<IndexPosition, Token> tokenIndexByPosition = getTokenIndexByPosition(); HashMap<String, ArrayList<IndexPosition>> index = new HashMap<String, ArrayList<IndexPosition>>(); HashMap<IndexPosition, String> rindex = new HashMap<IndexPosition, String>(); for (Entry<IndexPosition, Token> entry : tokenIndexByPosition.entrySet()) { BoardToken value = (BoardToken) entry.getValue(); rindex.put(entry.getKey(), value.letter); if (!index.containsKey(value.letter)) index.put(value.letter, new ArrayList<IndexPosition>()); index.get(value.letter).add(entry.getKey()); } ArrayList<ArrayList<IndexPosition>> paths = new ArrayList<ArrayList<IndexPosition>>(); boolean isFirstLetter = true; for (String letter : _language.tokens(commandText)) { ArrayList<IndexPosition> matches = index.get(letter); if (null == matches) return null; ArrayList<ArrayList<IndexPosition>> newpaths = new ArrayList<ArrayList<IndexPosition>>(); for (IndexPosition match : matches) { if (isFirstLetter) { ArrayList<IndexPosition> a = new ArrayList<IndexPosition>(); a.add(match); newpaths.add(a); } else { for (ArrayList<IndexPosition> path : paths) { IndexPosition indexPosition = path.get(path.size() - 1); if (match.is2dAdjacentTo(indexPosition) && !path.contains(match)) { path = new ArrayList<IndexPosition>(path); path.add(match); newpaths.add(path); } } } } if (newpaths.size() == 0) { return null; } paths = newpaths; isFirstLetter = false; } if (paths.size() == 0) { return null; } return paths; }