Java - реализовать матрицу, используя HashMap

1

Я пытаюсь реализовать матрицу с использованием хэш-карты, но я думаю, что я что-то делаю неправильно. Если я наберу следующую матрицу:

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();
        }

Любые идеи, что я делаю неправильно?

  • 0
    Класс Index переопределяет equals() и hashCode() ? Где этот класс объявлен?
  • 0
    где определен ваш класс Index?
Теги:
hashmap

2 ответа

1
Лучший ответ
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;
    }

}
0

Я думаю, что ваш конструктор должен ссылаться на содержимое [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]);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню