code: public String next() {
  	if (!hasNext()) {
  	    throw new NoSuchElementException();
  	}
  
  	String token = tokenizer.next();
  
  	// Determine whether the next token to return could be the start of a
  	// recognized compound token
  	CompoundTokens compounds = compoundTokens.get(token);
  	
  	// Determine how many tokens are needed at most and see if any grouping
  	// exists
  	if (compounds != null) {
  	    List<String> nextTokens = tokenizer.peek(compounds.maxTokens());
  	    Duple<Integer,String> compound = compounds.findMatch(nextTokens);
  	    if (compound != null) {
  		// shift off the number of extra tokens in the compound
  		for (int i = 0; i < compound.x; ++i) 
  		    tokenizer.next();
  		return compound.y;
  	    }
  	    else return token;
  	}
  	
  	// If there was no possibility of grouping this token, then return it by
  	// itself
  	return token;
      }
docs: Returns the next token in the stream.  Note that unlike other iterators,
  this method is {@code O(n)} in complexity where {@code n} is the number
  of unique words starting the set of compound tokens recognized by this
  iterator.