Matrix Klasse mit Mehrdimensionalen Array (Addition, Multiplikation, to String)

Diskutiere Matrix Klasse mit Mehrdimensionalen Array (Addition, Multiplikation, to String) im Java Basics - Anfänger-Themen Bereich.
F

fhoffmann

Denn im add und muliply wird eine int[][] als Paramter mitgegeben oder ist das auch falsch ?
Du solltest den Metoden eine MathMatrix als Parameter mitgeben.

Und dazu wäre auch möglicherweise ein weiterer Konsruktor hilfreich:
Java:
public MathMatrix(int zeilenAnzahl, int spaltenAnzahl)
 
Zuletzt bearbeitet:
Z

zDieTaschenlampe

Okey das kann ich dann noch easy abändern, aber hat wer eine Ahnung wie ich die show Methode hinbekomme ? Ich hab das bisher :

Code:
public void show() {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                Terminal.printLine(matrix[i][j]);
            }
        }
    }
Das liefert die richtigen Zahlen, aber die falsche Darstellung, da jede Zeile in eine neue Zeile gepackt wird. Tips wie ich das umgehen kann? Nicht verwirren lassen, das terminal entspricht dem system.out.println
 
F

fhoffmann

Da sind wir wieder bei deiner ursprüglichen Frage: Wie soll ich toString implementieren? Das geht so (ungetestet):
Java:
   public String toString() {
        String s = "";
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                s += String.format(%5d ", matrix[i][j]); // hinzufügen (+=)
           }
           s += "/n": // Zeielenumbruch
        }
        return s;
    }
 
Zuletzt bearbeitet:
Z

zDieTaschenlampe

Da sind wir wieder bei deiner ursprüglichen Frage: Wie soll ich toString implementieren? Das geht so (ungetestet):
Java:
   public String toString() {
        String s = "";
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                s += String.format(%5d ", matrix[i][j]); // hinzufügen (+=)
           }
           s += "/n": // Zeielenumbruch
        }
        return s;
    }
Erstmal danke für die Antwort, aber ich hatte ja schon eine funktionierende toString Methode, die so aussieht :

Code:
public String toString() {
        StringBuilder builder = new StringBuilder();
        for (int[] m : matrix) {
            for (int i : m) {
                builder.append(i).append(" ");
            }
            builder.append("\n");
        }
        return builder.toString();
    }
Die Darstellung gelingt dann auch, wenn ich m mauell printe, aber sobald ich in der show Methode folgendes versuche :

Code:
public void show() {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                Terminal.printLine(matrix[i][j]);
            }
        }

    }
dann wird die toString methode nicht aufgerufen aber wieso nicht ?
 
Z

zDieTaschenlampe

Naja, weil du sie nicht aufrufst sofern stattdessen über irgendein Array iterierst und die Werte daraus ausgibst?
Wird die toString methode nicht automatisch aufgerufen, sobald man eine print Methode aufruft? Kannst du mir sagen, was ich wie ändern muss ?
 
mrBrown

mrBrown

Wenn du irgendein Objekt print’est wird dessen toString aufgerufen, du machst das aber nur mit ints.
In show brauchst du nur eine einzige Zeile, reicht der Hinweis?

In welcher Klasse liegt show eigentlich?
 
Z

zDieTaschenlampe

Wenn du irgendein Objekt print’est wird dessen toString aufgerufen, du machst das aber nur mit ints.
In show brauchst du nur eine einzige Zeile, reicht der Hinweis?

In welcher Klasse liegt show eigentlich?
Ja dann war es mir doch klar, dass da mein Matrix objekt rein muss, aber es hängt trotzdem noch irgendwo, denn wie mach ich das. Wie folgt ist es falsch :
Code:
Terminal.printLine(MathMatrix()); // irgendwie muss hier die Matrix rein, aber wie ?
show liegt in der Matrix klasse und ist eine der 3 Methoden, die ich implementieren muss.
 
Z

zDieTaschenlampe

Oder MUSS ich doch alle Methoden ändern, sodass eine Matrix jedes mal erzeugt wird und zurückgegeben wird. Diese dann als Attribut speichern und das dann für show benutzen ?
 
mrBrown

mrBrown

show liegt in der Matrix klasse
Show soll nicht in der Matrix-Klasse stehen:
In der Matrix-Klasse soll keine Ein- oder Ausgabe stattfinden.

Oder MUSS ich doch alle Methoden ändern, sodass eine Matrix jedes mal erzeugt wird und zurückgegeben wird.
Ja, jede Methode muss ein Matrix-Objekt zurück geben, kein int-Array.


Diese dann als Attribut speichern und das dann für show benutzen ?
In der Matrix selber sollte es nur ein Attribut geben, das eine int-Array, was im Konstruktor zugewiesen wird.
Ins Blaue geraten soll Show vermutlich eine Matrix als Parameter haben.
 
Z

zDieTaschenlampe

Show soll nicht in der Matrix-Klasse stehen:



Ja, jede Methode muss ein Matrix-Objekt zurück geben, kein int-Array.



In der Matrix selber sollte es nur ein Attribut geben, das eine int-Array, was im Konstruktor zugewiesen wird.
Ins Blaue geraten soll Show vermutlich eine Matrix als Parameter haben.
Wenn schon nicht in der Matrix klasse stehen soll oder darf, wo soll das sonst hin? In die Klasse mit der main Methode oder was ?

Und wer lesen kann ist klar im Vorteil xD, denn du hast Recht. show bekommt eine Matrix als paramter, d.h für mich ich muss jetzt erstmal alle Methoden umschreiben
 
Z

zDieTaschenlampe

Ich weiß, aber nicht ganz wie die neue Add methode aussehen soll. Also ich denke ich habs fast, aber kannst du mir kurz aushelfen :

Code:
public MathMatrix add1(Mathmatrix mathmatrix) {
        int[][] sum = new int[matrix.length][matrix[0].length];

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                sum[i][j] = matrix[i][j] + secondMatrix[i][j];  // Hier passt es jetzt nicht, secondMatrix war noch der int[][] von vorher

            }
        }
        return new MathMatrix(sum);
    }
Edit :
Hast du dir es so vorgestellt ? So sollte es doch passen
Code:
public MathMatrix add1(MathMatrix mathmatrix) {
        int[][] secondMatrix = mathmatrix.getMatrix();
        int[][] sum = new int[matrix.length][matrix[0].length];

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                sum[i][j] = matrix[i][j] + secondMatrix[i][j];

            }
        }
        return new MathMatrix(sum);
    }
Edit 2.0 : Jetzt bin an genau dem Punkt, den ich vorhin angesprochen habe. Ich erzeuge zwar eine neue Matrix die die Summe aus 2 Matrizen darstellt, aber die wird ja nirgendwo gespeichert oder seh ich das falsch ?
 
Zuletzt bearbeitet:
mrBrown

mrBrown

Wenn schon nicht in der Matrix klasse stehen soll oder darf, wo soll das sonst hin? In die Klasse mit der main Methode oder was ?
Ja, in der Klasse wäre es passender.

Edit 2.0 : Jetzt bin an genau dem Punkt, den ich vorhin angesprochen habe. Ich erzeuge zwar eine neue Matrix die die Summe aus 2 Matrizen darstellt, aber die wird ja nirgendwo gespeichert oder seh ich das falsch ?
Naja, das ist an dir, die irgendwo zu speichern. Rufst du die Methode denn irgendwo auf?
 
Z

zDieTaschenlampe

Ja, in der Klasse wäre es passender.


Naja, das ist an dir, die irgendwo zu speichern. Rufst du die Methode denn irgendwo auf?
Oh ich hab ja nicht die ganze Aufgabe gepostet, also der Anfang war ja diese Methoden implementieren und der 2. Teil der Aufgabe lautet :
"Zusätzlich erstellen Sie eine Klasse Main, welche eine main ()-Methode enthält, in der die Ein und Ausgabe stattfindet. Die Eingabe findet via Kommandozeilenargumente (Command Line Arguments) statt. Die Kommandozeilenargumente können Sie aus dem args-Parameter der main ()-
Methode auslesen. Als erstes Argument wird die Operation angegeben (s.o.), danach folgen eine Matrix bei show bzw. zwei Matrizen bei add und multiply. Eine Matrix wird dabei als durch Semikolon separierte Liste von Zeilen dargestellt. Eine Zeile besteht aus 32-Bit-Ganzzahlen, die jeweils durch Kommata separiert werden. Sie können davon ausgehen, dass alle Eingaben syntaktisch und semantisch korrekt sind. Das Programm soll daraufhin das Ergebnis der Operation ausgeben. "

Also stand jetzt hab ich die neu erzeugt Matrix als Attribut in der Matrix klasse, aber ob das sinnvoll ist weiß ich noch nicht. Aufjeden Fall besteht jetzt mein Hauptproblem darin, dass ich nicht weiß wie ich die Kommandozeilenargumente so auslesen kann, dass es 1. ein int[][] ergibt, welches ich benutzen kann und 2. dieses Semikolon entferne.
Außerdem bin ich mir bezüglich show immernoch unsicher. Kommt das einfach in die main Methode ? Quasi so
Code:
 .... if (args[0].equals("show")){
 Terminal.println(args[1]);
 }
 
 ??? Das ist doch dann keine methode, sonern einfach eine Anweisung in der main Methode oder seh ich da was falsch
 
Z

zDieTaschenlampe

Ich verstehe immernoch nicht, wie die Methoden add und multipy mit Matrix objekten funktionieren soll bzw wie die auszusehen haben, denn das was ich habe klappt so nicht, egal was ich tue.

Meine Methoden nur mit den int[][] hingegen klappt aber kann mir bitte wer aushelfen xD

Edit : Nevermind. Ich glaube ich hab verstanden, was ihr meint. Also die Methoden laufen, aber die Probleme aus meinem Beitrag davon mit dem Auslesen von den Werten aus der Kommandozeile und das parsen davon bereitet mir Kopfschmerzen
 
Zuletzt bearbeitet:
Z

zDieTaschenlampe

Das folgende ist oder sollte die grobe Struktur der main Klasse mit main Methode sein, aber wie gesagt, wie parse ich bitte ein mehrdimensionales Array ? Wenn ich das habe, sollte eigentlich alles passen.
Code:
package uebungsblattTwo;

import edu.kit.informatik.Terminal;

public class MainMatrix {

    public static void main(String[] args) {

        int[][] firstMatrix = args[1];
        int[][] secondMatrix = args[2];
        MathMatrix mathmatrix1 = new MathMatrix(firstMatrix);
        MathMatrix mathmatrix2 = new MathMatrix(secondMatrix);

        if (args[0].equals("add")) {
            mathmatrix1.add1(mathmatrix2);
        } else if (args[0].contentEquals("multiply")) {
            mathmatrix1.multiply1(mathmatrix2);

        } else if (args[0].contentEquals("show")) {
            Terminal.printLine(firstMatrix);
        }
    }
}
 
F

fhoffmann

Java:
int[][] firstMatrix = args[1];
args[1] ist ein String - es kann nicht automatisch in ein int[][] umgewandelt werden.
 
Z

zDieTaschenlampe

Java:
int[][] firstMatrix = args[1];
args[1] ist ein String - es kann nicht automatisch in ein int[][] umgewandelt werden.
Ja ist mir schon klar, aber danach frag ich euch doch. Mir ist schon klar, dass ich das Kommandozeilenargument parsen muss, aber wie parse ich das bitte bei nem mehrdimensionalen Array ?
args[0] ist einfach, denn das ist einfach immer der Befehl und das ist einfach zu übernehmen, aber wie übersetze ich beispielsweise folgendes : 1 , 2 ; 0,3 3 , 4 ; 3 , 4 ? Das semikolon trennt die jeweiligen Zeilen der Matrix und die leertaste unterscheidet die 2 Matrizen voneinader, aber wie parse ich das?
Ich brauche sicherlich den .split Befehl, aber wie gesagt ich weiß leider nicht wie ich so eine Beispieleingabe übersetzen/parsen kann in ein int[][] das ich benutzen kann
 
F

fhoffmann

Vergiss doch erst einmal die Eingabe über die Konsole!
Probiere, die Klasse MathMatrix sauber zu schreiben
und teste sie mit festen Eingaben in der Main-Funktion.
 
Z

zDieTaschenlampe

Vergiss doch erst einmal die Eingabe über die Konsole!
Probiere, die Klasse MathMatrix sauber zu schreiben
und teste sie mit festen Eingaben in der Main-Funktion.
Hab ich doch schon und es funktioniert auch alles xD. Hab doch schon paar Posts vorher gesagt, dass ich die Methoden umgeschrieben habe, sodass beim Rechnen immer eine MathMatrix zurückgegeben wird . Deswegen brauch ich nur noch die main methode und das einzige was mir da fehlt ist das parsen der Kommandoargumente
 
Thema: 

Matrix Klasse mit Mehrdimensionalen Array (Addition, Multiplikation, to String)

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben