/**
  * Tests this dataset for equality with an arbitrary object.
  *
  * @param obj the object (<code>null</code> permitted).
  * @return A boolean.
  */
 @Override
 public boolean equals(Object obj) {
   if (obj == this) {
     return true;
   }
   if (!(obj instanceof TestIntervalCategoryDataset)) {
     return false;
   }
   TestIntervalCategoryDataset that = (TestIntervalCategoryDataset) obj;
   if (!getRowKeys().equals(that.getRowKeys())) {
     return false;
   }
   if (!getColumnKeys().equals(that.getColumnKeys())) {
     return false;
   }
   int rowCount = getRowCount();
   int colCount = getColumnCount();
   for (int r = 0; r < rowCount; r++) {
     for (int c = 0; c < colCount; c++) {
       Number v1 = getValue(r, c);
       Number v2 = that.getValue(r, c);
       if (v1 == null) {
         if (v2 != null) {
           return false;
         }
       } else if (!v1.equals(v2)) {
         return false;
       }
     }
   }
   return true;
 }
 /**
  * Returns a clone of the dataset.
  *
  * @return A clone.
  * @throws CloneNotSupportedException if there is a problem cloning the dataset.
  */
 @Override
 public Object clone() throws CloneNotSupportedException {
   TestIntervalCategoryDataset clone = (TestIntervalCategoryDataset) super.clone();
   clone.data = (KeyedObjects2D) this.data.clone();
   return clone;
 }