Я пытаюсь реализовать матрицу с использованием хэш-карты, но я думаю, что я что-то делаю неправильно. Если я наберу следующую матрицу:
4 3
2 1
я получил
0 3
0 0
Вот мой код:
package matrix;
import java.util.HashMap;
public class SparseMatrix extends AbstractMatrix{
private int x=0; // nr of rows
private int y=0; // nr of columns
private int hashvalue = 0;
public void Index (final int x, final int y)
{
this.x=x;
this.y=y;
hashvalue=((x+"")+(y+"")).hashCode();
}
public boolean equals (final Object obj)
{
if (obj instanceof Index)
{
Index index = (Index) obj;
return ((x==index.x) && (y==index.y));
}
else
return false;
}
public int hashCode()
{
return hashvalue;
}
private int rows;
private int columns;
private HashMap<Index,Double> values;
private boolean validIndex (final int row, final int column)
{
return (row>=0 && row<rows && column>=0 && column<columns);
}
public SparseMatrix(double[][] contents) throws MatrixException {
this(contents.length,contents[0].length);
for (int i=0; i<contents.length; i++)
for (int j=0; j<contents[0].length; j++)
setElement(i,j,contents[i][j]);
}
public SparseMatrix(int rows, int columns) throws MatrixException {
if (rows<1 || columns<1)
throw new MatrixException("Number of rows and columns cannot be less than 1");
this.rows=rows;
this.columns=columns;
this.values=new HashMap<Index,Double>();
}
@Override
public int getNumberOfRows() {
return rows;
}
@Override
public int getNumberOfColumns() {
return columns;
}
@Override
public double getElement(int row, int column) throws MatrixException {
if (!validIndex(row,column))
throw new MatrixException (row,column);
Index index = new Index (row,column);
if (values.containsKey(index))
return values.get(index);
else
return 0;
}
@Override
public void setElement(int row, int column, double value) throws MatrixException {
if (!validIndex(row,column))
throw new MatrixException (row,column);
Index index = new Index(row,column);
if (value==0)
{
if (values.containsKey(index))
values.remove(index);
}
else
values.put(index,value);
}
}
и моя основная функция:
a2 = new SparseMatrix(2,2);
a1.setElement(0,0,4);
a1.setElement(0,1,3);
a1.setElement(1,0,2);
a1.setElement(1,1,1);
for (int i=0; i<a2.getNumberOfRows(); i++)
{
for (int j=0; j<a2.getNumberOfColumns(); j++)
System.out.print (a2.getElement(i, j)+ " ");
System.out.println();
}
Любые идеи, что я делаю неправильно?
public void Index (final int x, final int y)
Похоже, что это должно было быть конструктором класса Index, но вместо этого это метод, и я не вижу класс Index, объявленный где угодно.
Вы назначаете экземпляр SparseMatrix
для a2
, но вызываете setElement
для a1
:
a2 = new SparseMatrix(2,2);
a1.setElement(0,0,4);
a1.setElement(0,1,3);
a1.setElement(1,0,2);
a1.setElement(1,1,1);
Я пробовал ваш код, исправляя все ошибки компиляции и не полагаясь на суперкласс AbstractMatrix
(удалив @Override
из всего переопределенного метода и изменив код в верхней части вашего класса на вложенный класс с именем Index) и получил желаемый результат:
4.0 3.0
2.0 1.0
Здесь вложенный класс Index
я использовал:
static class Index {
private int x=0; // nr of rows
private int y=0; // nr of columns
private int hashvalue = 0;
public Index (final int x, final int y)
{
this.x=x;
this.y=y;
hashvalue=((x+"")+(y+"")).hashCode();
}
public boolean equals (final Object obj)
{
if (obj instanceof Index)
{
Index index = (Index) obj;
return ((x==index.x) && (y==index.y));
}
else
return false;
}
public int hashCode()
{
return hashvalue;
}
}
Я думаю, что ваш конструктор должен ссылаться на содержимое [i] вместо содержимого [0]
public SparseMatrix(double[][] contents) throws MatrixException {
this(contents.length,contents[0].length);
for (int i=0; i<contents.length; i++)
for (int j=0; j<contents[i].length; j++)
setElement(i,j,contents[i][j]);
}
Index
переопределяетequals()
иhashCode()
? Где этот класс объявлен?