package com.github.donkirkby.vograbulary.anagrams; public class LetterSet { private char[] mDeck; private int mNextTileToShow; private int mNextTileToHide; private int mNextTileToReserve; public LetterSet(String letters) { mDeck = letters.toCharArray(); } /** * Show the next letter from the set. * @return the letter */ public char showNextLetter() { return mDeck[mNextTileToShow++]; } /** * Get the list of currently visible letters. Letters are added to this * list by calling showLetter() and removed by calling removeLetter(). * @return the letters */ public String getVisibleLetters() { return new String( mDeck, mNextTileToHide, mNextTileToShow-mNextTileToHide); } /** * Reserve a letter to be hidden by a call to hideReservedLetters(). * @param letter The letter to reserve. * @return true if the letter was successfully reserved, false if none * of the unreserved, visible letters matched letter. */ public boolean reserveLetter(char letter) { boolean isFound = false; for (int j = mNextTileToReserve; j < mNextTileToShow && ! isFound; j++) { isFound = letter == mDeck[j]; if (isFound) { mDeck[j] = mDeck[mNextTileToReserve]; mDeck[mNextTileToReserve++] = letter; } } return isFound; } /** * Hide all letters from the set that were previously reserved. */ public void hideReservedLetters() { mNextTileToHide = mNextTileToReserve; } /** * Release any reserved letters so that they can be reserved again. */ public void releaseReservedLetters() { mNextTileToReserve = mNextTileToHide; } @Override public String toString() { StringBuilder builder = new StringBuilder(); for (int i = 0; i < mDeck.length; i++) { if (i == 0 && 0 != mNextTileToHide) { builder.append('['); } if (i == mNextTileToHide) { if (0 != mNextTileToHide) { builder.append(']'); } if (mNextTileToHide != mNextTileToReserve) { builder.append('('); } } if (i == mNextTileToReserve && mNextTileToHide != mNextTileToReserve) { builder.append(')'); } if (i == mNextTileToShow) { builder.append('{'); } builder.append(mDeck[i]); } if (mNextTileToShow != mDeck.length) { builder.append('}'); } return builder.toString(); } /** * Show any letters that have not been shown yet. */ public void showAllRemaining() { mNextTileToShow = mDeck.length; } /** * Count how many letters have not been shown yet. * @return the count. */ public int getRemainingCount() { return mDeck.length - mNextTileToShow; } }