public boolean eliminateWithCluster(int clusterSize){
        boolean eliminated = false;
        //Search the statistic for count of clusterSize. 
        ArrayList<String> matchCountValues = new ArrayList<String>();
        HashMap<String, Integer> possibleValueCounters = this.getStatistic(); 
        String[] values = possibleValueCounters.keySet().toArray(new String[possibleValueCounters.size()]);
        for (String value: values){
            if (possibleValueCounters.get(value) == clusterSize){
                matchCountValues.add(value);
            }
        }
        //If there are at least clusterSize values with this count then test all combinations of selecting 
        //clusterSize elements from them. Stop early when a match is found.
        if (matchCountValues.size() >= clusterSize){
           ArrayList<String[]> allCombinations = new ArrayList<String[]>();
           ArrayList<String> combination = new ArrayList<String>();
           this.generateAllNElementCombinations(clusterSize, combination, matchCountValues, allCombinations);
           ArrayList<SudokuCell> matchCells = new ArrayList<SudokuCell>();
           ArrayList<String> matchCombination = new ArrayList<String>();
           this.findExactlyNCells(allCombinations, clusterSize, matchCells, matchCombination);
           if(matchCells.size() != 0){
               for(SudokuCell sudokuCell: this.sudokuCells.toArray(new SudokuCell[this.sudokuCells.size()])){
                   if(matchCells.contains(sudokuCell)){
                       sudokuCell.limitPossibleValues(matchCombination);
                   }
                   else{
                       sudokuCell.removePossibleValues(matchCombination);
                   }
               }
               eliminated = true;
           }
        }
    return eliminated;
    }