W
wizard of oz
I'm trying to write a data class using generics. This class is a Sparse
Matrix meaning that it can have many dimensions but not many entries (e.g. a
100 by 100 matrix, but there might only be 10 entries in the matrix).
I intend to use LinkedLists or Trees to manage the row and column keys and
probably a hash Map to manage the cells - but that's not important right
now.
My first step is that in my add method, I need to ensure that my row and
column keys are in my list. I would like to use one common routine for this.
The problem is I can't figure out the right generics syntax.
Here is what I started with:
public class SparseMatrix<R, C, E> {
private TreeSet<R> rowHeaders = new TreeSet<R> ();
private TreeSet<C> colHeaders = new TreeSet<C> ();
public void add (R rowKey, C colKey, E element) {
ensureExists (rowHeaders, rowKey);
ensureExists (colHeaders, colKey);
}
private void ensureExists (TreeSet<? extends Object> treeSet, Object
key) {
Iterator<? extends Object> keyIt = treeSet.iterator();
Object k = null;
while (keyIt.hasNext()) {
k = keyIt.next();
if (k.equals(key)) {
break;
}
k = null;
}
if (k == null) {
treeSet.add (key);
}
}
}
The problem is that the compiler is complaining about the treeSet.add (key)
near the bottom. The error is:
symbol : method add(java.lang.Object)
location: class java.util.TreeSet<capture#346 of ? extends java.lang.Object>
treeSet.add (key);
So far I've searched google for the error message and tried various (random)
combinations of ensureExists method signatures, but just can't get it to
work. The only thing I've found to work is if I duplicate the routine and
overload it as in:
private void ensureExists (TreeSet<R> treeSet, R key) {
....
private void ensureExists (TreeSet<C> treeSet, C key) {
....
Obviously I'd rather not duplicate the method - that seems silly.
Any help appreciated.
TIA
Matrix meaning that it can have many dimensions but not many entries (e.g. a
100 by 100 matrix, but there might only be 10 entries in the matrix).
I intend to use LinkedLists or Trees to manage the row and column keys and
probably a hash Map to manage the cells - but that's not important right
now.
My first step is that in my add method, I need to ensure that my row and
column keys are in my list. I would like to use one common routine for this.
The problem is I can't figure out the right generics syntax.
Here is what I started with:
public class SparseMatrix<R, C, E> {
private TreeSet<R> rowHeaders = new TreeSet<R> ();
private TreeSet<C> colHeaders = new TreeSet<C> ();
public void add (R rowKey, C colKey, E element) {
ensureExists (rowHeaders, rowKey);
ensureExists (colHeaders, colKey);
}
private void ensureExists (TreeSet<? extends Object> treeSet, Object
key) {
Iterator<? extends Object> keyIt = treeSet.iterator();
Object k = null;
while (keyIt.hasNext()) {
k = keyIt.next();
if (k.equals(key)) {
break;
}
k = null;
}
if (k == null) {
treeSet.add (key);
}
}
}
The problem is that the compiler is complaining about the treeSet.add (key)
near the bottom. The error is:
symbol : method add(java.lang.Object)
location: class java.util.TreeSet<capture#346 of ? extends java.lang.Object>
treeSet.add (key);
So far I've searched google for the error message and tried various (random)
combinations of ensureExists method signatures, but just can't get it to
work. The only thing I've found to work is if I duplicate the routine and
overload it as in:
private void ensureExists (TreeSet<R> treeSet, R key) {
....
private void ensureExists (TreeSet<C> treeSet, C key) {
....
Obviously I'd rather not duplicate the method - that seems silly.
Any help appreciated.
TIA