Ergebnis 1 bis 4 von 4

Java Matrix Klasse

  1. #1 Zitieren
    General Avatar von Kirgo
    Registriert seit
    May 2009
    Ort
    An einem Ort wo Raum und Zeit Nebensachen sind.
    Beiträge
    3.747
    Hallo.

    Ich muss eine Klasse erstellen die ein Zweidimensionales Array kreiert.

    Hier ist die Klasse.

    PHP-Code:
    public class Matrix {
        
        
    int columns;
        
    int rows;
        
        
        
    Matrix(){
        }
        
        public 
    Matrix(int rowsint columns){
            
    Matrix [][] marray = new Matrix[columns][rows];
        }
        


    Und das ist meine Mainmethode.

    PHP-Code:
    public class Matrizen {
        public static 
    void main(String[]args){
            
    int reihe=5;
            
    int saule=5;
            
            
    Matrix marray = new Matrix(reihe,saule);
            
            for (
    int i=0i<3i++){
                
    System.out.println(marray);
            }
        }


    Aber ich kriegs nicht zum laufen. Das Problem scheint beim aufrufen der Klasse zu sein.
    Der Compiler sagt er kann nicht in Arrays auflösen. Sondern in Matrix.
    Und wenn er in Matrix macht, klappts aber ich habe irgendwie kein richtiges Array.
    Kirgo ist offline

  2. #2 Zitieren
    Legende Avatar von jabu
    Registriert seit
    Jul 2011
    Beiträge
    7.383
    Zitat Zitat von Kirgo Beitrag anzeigen
    Ich muss eine Klasse erstellen die ein Zweidimensionales Array kreiert.
    [...]
    Aber ich kriegs nicht zum laufen. Das Problem scheint beim aufrufen der Klasse zu sein.
    Der Compiler sagt er kann nicht in Arrays auflösen. Sondern in Matrix.
    Und wenn er in Matrix macht, klappts aber ich habe irgendwie kein richtiges Array.
    Guck erst mal in deinen Konstruktor (interessanter Typ für ein stinknormales Array...):
    Code:
    Matrix [][] marray = new Matrix[columns][rows];
    Und für später: Wie willst du auf die Elemente des Arrays zugreifen?
    jabu ist offline Geändert von jabu (10.12.2015 um 22:26 Uhr)

  3. #3 Zitieren
    General Avatar von Kirgo
    Registriert seit
    May 2009
    Ort
    An einem Ort wo Raum und Zeit Nebensachen sind.
    Beiträge
    3.747
    Soll ich "Matrix" mit double ersetzen?

    double [][] marray = new Matrix[columns][rows];


    Auf die Elemente des Arrays zugreifen?
    Ich dachte an zwei Indexvariablen die immer auf die verschiedenen Segmente zeigen können.

    marray[2][1] = 4;

    So etwa.
    Kirgo ist offline

  4. #4 Zitieren
    Legende Avatar von jabu
    Registriert seit
    Jul 2011
    Beiträge
    7.383
    Zitat Zitat von Kirgo Beitrag anzeigen
    Soll ich "Matrix" mit double ersetzen?
    Falls in dem Array Elemente des Typs double gespeichert werden sollen, ist das richtig!

    double[][] marray = new Matrix[columns][rows];
    Eine Kleinigkeit fehlt noch, denn rechts von dem new müsste anstelle von Matrix ebenfalls double stehen:
    Code:
    double[][] marray = new double[columns][rows];
    Warum?
    Du möchtest doch per new... ein Array mit Elementen vom Typ double (nicht vom Typ Matrix) erzeugen. Und darauf möchtest du mit marray zugreifen.

    Was new zurückgibt, ist eine Referenz auf das Array. Mit dieser wird marray initialisiert. double[][] kennzeichnet bloß den Typ von marray, denn was links vom Gleichzeichen steht, ist nur eine Deklaration. Insgesamt findet aber durch die Zuweisung des Arrays an marray eine Initialisierung statt. Dabei wird jedoch nicht das Array kopiert, sondern bloß seine Referenz, welche marray erhält.
    "Richtige" Objekte werden (im Gegensatz zu einfachen Variablen), per "=", nicht als solche kopiert, sondern nur ihre Referenz. Diese Referenzen kann man ziemlich sorglos kreuz und quer durch den Code schmeißen, weil immer dasselbe Objekt referenziert wird. Es kommt zu keinerlei versehentlichen Duplikaten und der Garbage Collector weiß, dass er das Objekt abräumen darf, sobald keine Referenzen mehr an dieses bestehen und nicht vorher. Das (und die Abwesenheit von Zeigern) macht Java besonders einsteigerfreundlich.

    Die seltsame Endlosrekursion (s.o.), indem du im Konstruktor von Matrix eine Instanz von Matrix erzeugen willst, also wieder diesen Konstruktor aufrufst, hätte natürlich nicht funktioniert.

    Mit...
    Code:
    . . .  new double[columns][rows];
    ...legst du ein zweidimensionales Array vom Typ double an. Alle Felder dieses Arrays werden automatisch mit 0.0d initialisiert (hab's im letzten Beitrag korrigiert).

    Ein Array ist (wie jedes "richtige" Objekt) - im Gegensatz zu byte, int, double usw. (Variablen) - von einem Referenztyp. Mit...
    Code:
    double[][] marray;
    ...wird ein Array deklariert, wobei marray ein Name ist, welcher ein Array referenzieren soll. Bei einer reinen Deklaration, wie hier, erfolgt die Initialisierung später.

    Mit...
    Code:
    marray = new double[columns][rows];
    ...wird marray endlich als Referenz auf das mit new... angelegte Array initialisiert. Dieses lässt sich nun mit dem Namen marray ansprechen.

    Das geht auch alles in einem Zuge (s.o.):
    Code:
    double[][] marray = new double[columns][rows];
    Wenn du das aber so in deinen Konstruktor packst, ist das marray nur in diesem Konstruktor gültig, denn außerhalb seines Scopes (was zwischen den geschweiften Klammern steht) ist der Name marray weder bekannt noch ansprechbar. Das ist auch gut so, denn wenn der Scope verlassen wird, darf (und soll irgendwann) der Garbage Collector das Array zerstören (den Speicher freigeben).

    Also muss das Array auch außerhalb des Konstruktors referenziert sein, um zugreifbar zu sein und weiterzuexistieren. Du möchtest es als Feld in der Klasse Matrix haben, also...

    Code:
    public class Matrix {
    
        // Das vorangestellte "m" wie "member" wurde zur Vereinheitlichung von marray übernommen,
        // wenngleich das von der Lesbarkeit her nicht optimal ist.
        // Felder machst du alle jeweils private, sobald die Zugriffsmethoden fertig sind
        public double[][] marray;
        public int mrows;
        public int mcolumns;  
        
        public Matrix(){
        }
        
        public Matrix(int rows, int columns){
            marray = new double[rows][columns];  // rows und columns sinnvoll vertauscht
            mrows = rows;        // mrows mit der Anzahl der Zeilen initialisieren
            mcolumns = columns;  // mcolumns mit der Anzahl der Spalten initialisieren
        }
    }

    Auf die Elemente des Arrays zugreifen?
    Ich dachte an zwei Indexvariablen die immer auf die verschiedenen Segmente zeigen können.

    marray[2][1] = 4;

    So etwa.
    Innerhalb der Klasse geht das natürlich. Um von außerhalb zuzugreifen, müsstest du deiner Klasse Zugriffsmethoden verpassen. Auf Felder, die als public gekennzeichnet sind, kannst du aber auch von außen zugreifen. Sinn der Kapselung ist das natürlich nicht, aber solange die Zugriffsmethoden fehlen, ist das die einzige Möglichkeit. Für den Zugriff auf einen Member einer Klassensinstanz brauchst du den Punktoperator. Wie das geht, weißt du doch, oder?

    Die Matrixklasse soll doch später noch Methoden für Matrixoperationen erhalten, nehme ich mal an... (?)
    Du hattest nämlich über die Aufgabenstellung viel zu wenig verraten. "Eine Klasse, die ein Array kreiert" kann nämlich vieles bedeuten. Also bin ich davon ausgegangen, dass alles zusammen später als Matrixklasse einen Sinn ergeben soll.
    jabu ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •