Avatar billede el_gnu Nybegynder
13. februar 2001 - 13:27 Der er 2 kommentarer og
1 løsning

kopiering af et objekt

  Hej,

I følgende klasse vil jeg gerne kunne \"kopiere\" de argumenter der gives i constructor\'ne.

Som det er nu, så får jeg en reference til det oprindelige objekt (eller rettere det oprindelige objekts variable) hvilket IKKE er hensigtsmæssigt!

Hvad gør jeg???


public class Matrix extends java.lang.Object {

    public double[][] matrix;
   
    public java.awt.Dimension dim;
   
    public Matrix() {
        dim = new java.awt.Dimension(0,0);
    }
   
    public Matrix(double[] ent,int bredde,int hoejde) {
        if (ent.length != bredde*hoejde)
            dim = new java.awt.Dimension(0,0);
        else {
            matrix = new double[hoejde][bredde];
            for (int i = 0 ; i < hoejde ; i++)
                for (int j = 0 ; j < bredde ; j++)
                    matrix[i][j] = ent[i*j+j];
            dim = new java.awt.Dimension(bredde, hoejde);
        }
    }
   
    public Matrix(double[][] mat) {
        matrix = mat;
        dim = new java.awt.Dimension(mat[0].length, mat.length);
    }

    public Matrix(Matrix mat) {
        this.matrix = mat.matrix;
        this.dim = mat.dim;
    }

    public java.lang.String toString() {
        java.lang.StringBuffer sb = new java.lang.StringBuffer(\"[\");
        for (int i = 0 ; i < dim.getHeight() ; i++) {
            sb.append(\"[\");
            for (int j = 0 ; j < dim.getWidth() ; j++) {
                if (j!=0) sb.append(\", \");
                sb.append(matrix[i][j]);
            }
            sb.append(\"]\\n\");
        }
        sb.append(\"]\");
        return sb.toString();
    }

    public Matrix multMatrix(Matrix mat) {
        if (dim.getWidth() != mat.dim.getHeight()) return null;
        double[][] ent = new double[(int) dim.getHeight()][(int) mat.dim.getWidth()];
        for (int i = 0 ; i < ent.length ; i++)
            for (int j = 0 ; j < ent[0].length ; j++) {
                ent[i][j] = 0;
                for (int k = 0 ; k < dim.getWidth() ; k++)
                    ent[i][j] += matrix[i][k]*mat.matrix[k][j];
            }
        return new Matrix(ent);
    }

    public Matrix multConstant(double k) {
        Matrix mat = new Matrix(this);
        for (int i = 0 ; i < dim.getHeight() ; i++)
            for (int j = 0 ; j < dim.getWidth() ; j++)
                mat.matrix[i][j] *= k;
        return mat;
    }

    public Matrix add(Matrix mat) {
        if (dim.getWidth() != mat.dim.getWidth() || dim.getHeight() != mat.dim.getHeight()) return null;
        Matrix matr = new Matrix(this);
        for (int i = 0 ; i < dim.getHeight() ; i++)
            for (int j = 0 ; j < dim.getWidth() ; j++)
                matr.matrix[i][j] += mat.matrix[i][j];
        return matr;
    }

    public Matrix transponer() {
        if (dim.getHeight() != dim.getWidth()) return null;
        double buff;
        Matrix mat = new Matrix(this);
        for (int i = 0 ; i < dim.getHeight() ; i++)
            for (int j = 1+i ; j < dim.getWidth() ; j++) {
                buff = mat.matrix[i][j];
                mat.matrix[i][j] = mat.matrix[j][i];
                mat.matrix[j][i] = buff;
            }
        return mat;
    }
}

el Gnu

( )
00///////>
~  /\\  /\\
Avatar billede pstric Nybegynder
13. februar 2001 - 13:41 #1
Skift din copy constructor ud med dette:

    public Matrix(double[][] mat) {
        matrix = new double[mat.length][mat[0].length];
        for (int i = 0; i < mat.length; i++) {
            for (int j = 0; j < mat[i].length; j++) {
                matrix[i][j] = mat[i][j];
            }
        }
        dim = new java.awt.Dimension(mat[0].length, mat.length);
    }

Avatar billede el_gnu Nybegynder
13. februar 2001 - 14:00 #2
thnx!
Avatar billede schioler Nybegynder
13. februar 2001 - 19:12 #3
Det vil være bedre at følge JAVAs clone mekanisme. Derved får du oprettet et object af samme type etc.
Dvs
public class Matrix extends java.lang.Object implements Cloneable { ......

Der skal så i klassen implementeres en
public object clone(){
  Matrix copy = (Matrix) super.clone();
  copy all vars.
  incl. deep copy
}


Anvendelse:

Matrix m1 = new Matrix();
... (use/set varianbles etc)

Matrix m2Copy = (Matrix) m1.clone();

m2Copy er i nu være en kopi, der ikke har \'skjulte\' referencer til samme objects.

mvh.

Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester