/**
   * * Create a FastVector containing the set of values found in the given row...
   *
   * <p>NOTE: As it happens, this function determines the order of the attribute values, an order
   * that will percolate throughout wekaMine and influence all subsequent displays.
   *
   * <p>Originally the valSet was a HashSet and the iteration order of that will depend on the hash
   * code for the key, and may seem random. While we would not like to rely on the order of
   * attributes, it seems desirable to make the attribute order somehow comprehensible, either sort
   * order or insertion order. Insertion order will seem random also because it is determined by the
   * arbitrary order of the instances. So it has been changed to a TreeSet which will be ordered by
   * the natural ordering of it's elements.
   */
  public FastVector getRowValues(Table t, int rowIdx) {
    TreeSet<String> valSet = new TreeSet<String>();
    for (int c = 0; c < t.cols(); c++) {
      String val = (String) t.matrix.getQuick(rowIdx, c);

      if (val == null) {
        System.err.println("null value in row:" + rowIdx + " col:" + c);
        for (int i = 0; i < t.cols(); i++) {
          System.err.println("\t" + i + "\t" + t.matrix.getQuick(rowIdx, c));
        }
      }

      // Don't want to include "missing value" as one of the nominal values...
      if (!val.equals("?")) {
        valSet.add(val);
      }
    }

    FastVector attVals = new FastVector();
    for (Object v : valSet) {
      attVals.addElement(v);
    }
    return (attVals);
  }
  /** * Create a FastVector containing the set of values found in the given col... */
  public FastVector getColValues(Table t, int colIdx) {
    HashSet<String> valSet = new HashSet<String>();
    for (int r = 0; r < t.rows(); r++) {
      String val = (String) t.matrix.getQuick(r, colIdx);

      if (val == null) {
        System.err.println("\nDEBUG r=" + r + "\tc=" + colIdx + "\tval=" + val);
        System.err.println("\nDEBUG r=" + t.rowNames[r] + "\tc=" + t.colNames[colIdx]);
      }

      // Don't want to include "missing value" as one of the nominal values...
      if (val != null) {
        if (!val.equals("?")) {
          valSet.add(val);
        }
      }
    }
    FastVector attVals = new FastVector();
    for (Object v : valSet) {
      attVals.addElement(v);
    }
    return (attVals);
  }