1 10 package org.jgap.audit; 11 12 import java.io.*; 13 import java.util.*; 14 import org.jgap.util.*; 15 16 22 public class KeyedValues2D 23 implements ICloneable, Serializable { 24 25 private static final String CVS_REVISION = "$Revision: 1.5 $"; 26 27 28 private List m_rowKeys; 29 30 31 private List m_columnKeys; 32 33 34 private List m_rows; 35 36 37 private boolean m_sortRowKeys; 38 39 45 public KeyedValues2D() { 46 this(false); 47 } 48 49 57 public KeyedValues2D(final boolean a_sortRowKeys) { 58 m_rowKeys = Collections.synchronizedList(new ArrayList()); 59 m_columnKeys = Collections.synchronizedList(new ArrayList()); 60 m_rows = Collections.synchronizedList(new ArrayList()); 61 m_sortRowKeys = a_sortRowKeys; 62 } 63 64 70 public int getRowCount() { 71 return m_rowKeys.size(); 72 } 73 74 80 public int getColumnCount() { 81 return m_columnKeys.size(); 82 } 83 84 95 public Number getValue(final int a_row, final int a_column) { 96 Number result = null; 97 final KeyedValues rowData = (KeyedValues) m_rows.get(a_row); 98 final Comparable columnKey = (Comparable ) m_columnKeys.get(a_column); 99 if (columnKey != null) { 100 result = rowData.getValue(columnKey); 101 } 102 return result; 103 } 104 105 113 public Comparable getRowKey(final int a_row) { 114 return (Comparable ) m_rowKeys.get(a_row); 115 } 116 117 125 public int getRowIndex(final Comparable a_key) { 126 if (m_sortRowKeys) { 127 return Collections.binarySearch(m_rowKeys, a_key); 128 } 129 else { 130 return m_rowKeys.indexOf(a_key); 131 } 132 } 133 134 140 public List getRowKeys() { 141 return Collections.unmodifiableList(m_rowKeys); 142 } 143 144 152 public Comparable getColumnKey(final int a_column) { 153 return (Comparable ) m_columnKeys.get(a_column); 154 } 155 156 162 public List getColumnKeys() { 163 return Collections.unmodifiableList(m_columnKeys); 164 } 165 166 175 public Number getValue(final Comparable a_rowKey, 176 final Comparable a_columnKey) { 177 Number result; 178 final int row = getRowIndex(a_rowKey); 179 if (row >= 0) { 180 final KeyedValues rowData = (KeyedValues) m_rows.get(row); 181 result = rowData.getValue(a_columnKey); 182 } 183 else { 184 result = null; 185 } 186 return result; 187 } 188 189 199 public void setValue(final Number a_value, final Comparable a_rowKey, 200 final Comparable a_columnKey) { 201 final KeyedValues row; 202 int rowIndex = getRowIndex(a_rowKey); 203 if (rowIndex >= 0) { 204 row = (KeyedValues) m_rows.get(rowIndex); 205 } 206 else { 207 row = new KeyedValues(); 208 if (m_sortRowKeys) { 209 rowIndex = -rowIndex - 1; 210 m_rowKeys.add(rowIndex, a_rowKey); 211 m_rows.add(rowIndex, row); 212 } 213 else { 214 m_rowKeys.add(a_rowKey); 215 m_rows.add(row); 216 } 217 } 218 row.setValue(a_columnKey, a_value); 219 final int columnIndex = m_columnKeys.indexOf(a_columnKey); 220 if (columnIndex < 0) { 221 m_columnKeys.add(a_columnKey); 222 } 223 } 224 225 235 public boolean equals(final Object a_object) { 236 if (a_object == null) { 237 return false; 238 } 239 if (a_object == this) { 240 return true; 241 } 242 if (! (a_object instanceof KeyedValues2D)) { 243 return false; 244 } 245 final KeyedValues2D kv2D = (KeyedValues2D) a_object; 246 if (!getRowKeys().equals(kv2D.getRowKeys())) { 247 return false; 248 } 249 if (!getColumnKeys().equals(kv2D.getColumnKeys())) { 250 return false; 251 } 252 int rowCount = getRowCount(); 253 int colCount = getColumnCount(); 254 for (int r = 0; r < rowCount; r++) { 255 for (int c = 0; c < colCount; c++) { 256 final Number v1 = getValue(r, c); 257 final Number v2 = kv2D.getValue(r, c); 258 if (v1 == null) { 259 if (v2 != null) { 260 return false; 261 } 262 } 263 else { 264 if (!v1.equals(v2)) { 265 return false; 266 } 267 } 268 } 269 } 270 return true; 271 } 272 273 279 public int hashCode() { 280 int result; 281 result = m_rowKeys.hashCode(); 282 result = 29 * result + m_columnKeys.hashCode(); 283 result = 31 * result + m_rows.hashCode(); 284 return result; 285 } 286 287 293 public Object clone() { 294 try { 295 return super.clone(); 296 } catch (CloneNotSupportedException cex) { 297 throw new CloneException(cex); 298 } 299 } 300 } 301 | Popular Tags |