Brauche Hilfe beim arbeiten mit Konstruktoren

Diskutiere Brauche Hilfe beim arbeiten mit Konstruktoren im Java Basics - Anfänger-Themen Bereich.
L

LeeSin

Guten Morgen :) ,

ich versuche aktuell die Konstruktoren richtig zu verstehen und bin derzeit mit einer Aufgabe beschäftigt die ich nich ganz verstehe.

Also ich soll einen Konstruktor erstellen der eine Zahl als String entgegen nimmt und diese dann Ziffernweise in einem Array vom typ int speichert.

So also ich erstelle dann eine Klasse namens z.b. "public class BigInt"

Dann erstelle ich eine Konstruktor :

Code:
public class BigInt{

BigInt(String number){
BigInt firstNumber = BigInt("23");
}

}
So jetzt ist nach meiner überlegung so, ich möchte jetzt die Elemente des Strings "zählen" also hier wären es ja in dem Beispiel der anzahl 2, somit wäre meine Dimension für ein int - Array auch 2.
Doch ich verstehe nicht wie ich diese String Elemente zählen kann? weil wenn ich innerhalb des Konstruktors sowas wie ".length" benutze funktioniert das nicht richtig.

Und wie kann ich den im allgemeinen Prüfen bei einem String ob es sich zum Beispiel um eine Natürliche zahl handelt, wie kann man diese Fälle checken? :)

Ich freue mich über jegliche Hilfe.
Beste Grüße
Lee
 
J

JustNobody

Also in Deinem Code hast Du zwei Dinge drin:
Code:
public class BigInt{
  // Hier definierst Du den Konstruktor
  BigInt(String number){
    // Hier rufst Du ihn direkt auf (Wobei das schlüsselwort new fehlte bei Dir!)
    BigInt firstNumber = new BigInt("23");
  }
}
Also bei so einer Aufgabe musst Du das schon teilen. Das obrige wäre sofort eine Endlosschleife. Eine Rekursion mag bei Konstruktoren eher unüblich sein, aber würde auch bei einem Konstruktor funktionieren - aber da wäre wie bei jeder Rekursion die Abbruchbedingung wichtig ...


Also teilen wir dies erst einmal auf.
Code:
public class BigInt{
  BigInt(String number){
    // todo
  }

  public static void main(String[] args) {
    // Wir testen die Klasse hier einmal....
    BigInt firstNumber = new BigInt("23");
  }
}
Damit hätten wir den Rahmen. Aber wir müssen die Klasse noch füllen:
"Ziffernweise in einem Array vom typ int speichert. " :
a)Wie speichert man etwas in so einer Instanz einer Klasse? Was muss ich in der Klasse hinzufügen und wo?
b) Wenn ich da etwas gebaut habe: Wie kriege ich das Konstrukt aus a) im Konstruktor erst einmal initialisiert (falls das notwendig ist) und wie bekomme ich da die gewünschten Daten rein?
 
J

JustNobody

Und da Du ja auch ein paar Dinge konkret gefragt hast:
a) Die Klasse String hat viele Methoden, die Du Dir einmal ansehen könntest z.B. unter https://docs.oracle.com/javase/7/docs/api/java/lang/String.html - Du könntest da z.B. neben dem length nach charAt schauen. Oder toCharArray ist evtl. auch interessant.
b) Wenn Du an einzelne chars heran kommst, dann kannst Du einmal die Werte ansehen, denn chars sind eigentlich auch schon integer. Aber sie entsprechen nicht der "visuellen Darstellung". '0' ist also nicht der Wert 0. Wenn Du dir die Werte einmal anschaust, dann findest du evtl. eine Berechnung? Und dann kannst Du ja die Ziffer prüfen, ob diese einen Wert von 0-9 hat ...
Oder Du schaust Dir die Klasse Integer an mit der Methode parseInt? Oder zur Not: das gute alte switch Statement. Würde ich hier nicht verwenden, aber würde natürlich auch funktionieren ....
 
J

JustNobody

Nunja - das hatte ich ja schon etwas beschrieben und den Algorithmus hätte der TE auch alleine finden können. Die Lösung wollte ich halt möglichst wenig vorgeben.
 
L

LeeSin

So ich danke euch beiden erst einmal für die Antworten! :)

@JustNobody

Ich dachte mir schon so etwas das man es aufteilen muss, danke das du mich damit dann bestätigt hast. War mir vorher sehr unsicher!

@MoxxiManger

Vielen Dank für den algorithmus, werde ich versuchen noch zu integrieren, ich versuche aber erstmal es selbst zu ertüflten falls es denn klappen sollte, aber danke!

Ich habe jetzt nämlich noch einbisschen rumprobiert und ich glaube viel zu viel, weil ich komme nicht auf das richtige :D

Code:
public class BigInt {

    // Class Attributes
    String number;
    int dimension;

    // Constructors
    BigInt(String number) {
        this.number = number;

        for (int i = 0; i < number.length(); i++) {
            number.charAt(i);
            dimension++;
        }

        // allocate new Array with that dimension
        int[] numberArray = new int[dimension];
        for (int j = 0; j < numberArray.length; j++) {
            numberArray[j] = number.charAt(j);

        }

    }

    public static void main(String args[]) {
        BigInt firstNumber = new BigInt("23");
        println(firstNumber.number);
    }

}
So jetzt habe ich das mal versucht, wahrscheinlich hätte ich mir einiges sparen können, doch habe ich beim debugger jetzt gecheckt rein therotisch werden diese beiden zahlen jetzt im Array gespeichert, aber laut debugger mit 50,51, wahrscheinlich dem ASCII zeichen code?
Ich habe das mit dem char noch nicht ganz geblickt wie ich das dann umwandeln kann.

Und vor allem wenn ich jetzt den Konstruktor aufrufe bekomme ich logischerweise immer nur die 23 ausgeben weil ich ja mit dem this. auf die "number" zeige und diese dann der Konstruktor liefert soweit richtig oder? Wie zeige ich jetzt aber auf mein Array? Wenn das nicht vom Datentyp "BigInt" ist, ich habe auch versucht es zu kopieren, haha aber dann war wieder eine Datentyp fehler.

Freue mich über jegliche Antworten
Grüße!
 
J

JustNobody

Also ein paar Punkte zu Deinem Code:
Code:
        for (int i = 0; i < number.length(); i++) {
            number.charAt(i);
            dimension++;
        }
Der Aufruf number.charAt(i) gibt ein Zeichen zurück, nur damit machst du nichts. Damit macht die Zeile nichts und kann weg.
Vergleiche doch einmal number.length() mit dem, was nach der Schleife in dimension ist. Fällt dir da etwas auf?

Java:
 // allocate new Array with that dimension
        int[] numberArray = new int[dimension];
        for (int j = 0; j < numberArray.length; j++) {
            numberArray[j] = number.charAt(j);
        }
numberArray ist hier als lokale Variable definiert worden. Aber das soll doch in BigInt gespeichert sein. Als was für eine Variable wäre es somit zu definieren?

Das setzen ist aber noch falsch und die Ursache hast Du schon gut erkannt. Das sind die Werte die die Zeichen laut Ascii Tabelle haben (wobei streng genommen das keine ascii Werte sondern unicode werte sind. Die stimmen hier aber überein).

Was da getan werden muss habe ich in Worten beschrieben und der Code ist schon von @MoxxiManagarm gebracht worden.

Zusätzliche Gedanken:
a) In der Aufgabe wurde nicht verlangt, dass die Klasse auch den ursprünglichen String und die Dimension merken sollte. Und da die Werte indirekt ja über die int Werte gespeichert sind, wäre das auch nicht wirklich notwendig.
 
L

LeeSin

Also ein paar Punkte zu Deinem Code:
Code:
        for (int i = 0; i < number.length(); i++) {
            number.charAt(i);
            dimension++;
        }
Der Aufruf number.charAt(i) gibt ein Zeichen zurück, nur damit machst du nichts. Damit macht die Zeile nichts und kann weg.
Vergleiche doch einmal number.length() mit dem, was nach der Schleife in dimension ist. Fällt dir da etwas auf?

Java:
 // allocate new Array with that dimension
        int[] numberArray = new int[dimension];
        for (int j = 0; j < numberArray.length; j++) {
            numberArray[j] = number.charAt(j);
        }
numberArray ist hier als lokale Variable definiert worden. Aber das soll doch in BigInt gespeichert sein. Als was für eine Variable wäre es somit zu definieren?

Das setzen ist aber noch falsch und die Ursache hast Du schon gut erkannt. Das sind die Werte die die Zeichen laut Ascii Tabelle haben (wobei streng genommen das keine ascii Werte sondern unicode werte sind. Die stimmen hier aber überein).

Was da getan werden muss habe ich in Worten beschrieben und der Code ist schon von @MoxxiManagarm gebracht worden.

Zusätzliche Gedanken:
a) In der Aufgabe wurde nicht verlangt, dass die Klasse auch den ursprünglichen String und die Dimension merken sollte. Und da die Werte indirekt ja über die int Werte gespeichert sind, wäre das auch nicht wirklich notwendig.
Danke für die Hilfe :)!

Also ich habe jetzt verstanden das number.length() mir das gewünschte ergebnis für meine größe des Arrays liefert.
Und das Array soll ich in der Klasse dann Global deklarieren? Also außerhalb des Konstruktors? Wie kann ich diesem dann die größe zuweisen, sobald ich ihm die Dimension gebe ist das Array leer, und ich glaube ändern geht nicht mehr?

Ich verstehe irgendwie nicht ganz wie ich auf was zugreifen kann, weil muss ich jetzt außeralb des Konstruktors innherhalb der Klasse BigIng mein Array deklarieren? Und dann über "this" im Kontruktor darauf zugreifen? Und dann noch auf die Dimension zugreifen?
Code:
public class BigInt {
    // Class Attributes
    int dimension;
    int[] numberArray = new int[dimension];

    BigInt(String number) {
        this.dimension = dimension;
        dimension = number.length();

        this.numberArray = numberArray;

    }

    public static void main(String args[]) {
        BigInt firstNumber = new BigInt("23");

    }

}
Bin da irgendwie überfordert und ich weiß auch nicht wie ich mir gerade helfen kann..

Mein Plan war jetzt ->

Das Array global für die klasse deklarieren aber dadurch das ich ja dimension als größe vorrausetze und es ja noch nichts zugewiesen wurde steht in meinem Array nichts.
 
J

JustNobody

Also bei Variablen musst Du zwei Dinge unterscheiden:
a) Die Deklaration, also die Erstellung. Das ist also ein Platz für einen bestimmten Basistypen oder für eine Referenz.
b) Der Zuweisung.

Also Du kannst sagen: Ich brauche einen Parkplatz. Dann bekommst Du diesen, aber Du musst nicht sofort ein Auto drauf stellen.

Also kannst Du die Variable in der Klasse als Instanzvariable definieren:
Java:
int[] numberArray;
Das ist dann also der Parkplatz. Und so lange Du da nichts drauf stellst, ist der Parkplatz leer (null).

In dem Konstruktor kannst Du nun sozusagen ein Auto auf den Parkplatz stelle:
Java:
numberArray = new int[dimension];
(Das natürlich erst, nachdem Du in dimension die benötigte Dimension zugewiesen hast.

Und als Anmerkung: Diese Befehle machen nichts:
Java:
        this.dimension = dimension;
        this.numberArray = numberArray;
dimension ist ja die Instanzvariable und somit weist Du den Wert aus der Instanzvariable ihr selbst zu.
Das Gleiche gilt für numberArray.

Solche Konstrukte sind nur dann wichtig, wenn die Instanzvariable hinter einer lokalen Variable versteckt wurde.

Also die Vergleiche hinken jetzt massiv. Aber ich baue mal einen, damit Du es evtl. etwas verstehst:
Du hast eine Geldbörse in der Tasche. Nun kann man Dir sagen (Methodenaufruf): Nimm das ganze Geld aus "der" Geldbörse und steck es in "deine" (entspricht dem this!) Geldbörse.
Da Du nur eine Geldbörse, nämlich Deine, hast, ist für die die Referenzierte Geldbörse natürlich Deine Geldbörse.
Und wie ich gesagt habe: Es ändert sich nichts. Du kannst das ganze Geld aus Deiner Geldbörse nehmen um es dann wieder hinein zu tun. Danach hast Du das gleiche Geld wie zuvor.

Nun ändern wir den Methodenaufruf - der bekommt einen Parameter "Geldbörse". Das bedeutet also: Wir drücken Dir eine andere Geldbörse in die Hand und sagen wieder: Nimm das ganze Geld aus "der" Geldbörse und steck es in "deine" (entspricht dem this!) Geldbörse.
Nun hast Du schon eine Geldbörse in der Hand, also bei "der" Geldbörse nimmst Du nun diese. Aber Deine Geldbörse ist immer noch die, die Du in der Tasche hast. Also hier ändert sich was: Dadurch dass ich dir meine Geldbörse in die Hand gedrückt habe, habe ich sozusagen Deine Geldbörse "versteckt". ==> Du willst auf eine Geldbörse zugreifen und heya: Hast ja schon eine in der Hand. Somit nimmst Du das Geld aus meiner Geldbörse, die ich dir in die Hand gedrückt hatte, raus. Nun sollst Du es in Deine Geldbörse packen. Die ist natürlich in Deiner Hosentasche und die kennst Du auch ganz genau! Und schwups: Jetzt hast Du da auch mein Geld mit drinnen ....

Das wäre also in Java ausgedrückt:
Java:
public class LeeSin {
  private Geldboerse geldboerse; // Deine Geldbörse in Deiner Tasche!
 
  public void transferGeld(Geldbörse geldboerse) {
    // geldboerse ist nun die Geldboerse, die Dir in die Hand gedrückt wurde!
    // Die Instanzvariable ist versteckt und kann nur noch mit this.geldboerse angesprochen werden!
    this.geldboerse.add(geldboerse.takeOutAll());
  } 
}
Hoffe, das war jetzt nicht zu verwirrend.
 
L

LeeSin

Also bei Variablen musst Du zwei Dinge unterscheiden:
a) Die Deklaration, also die Erstellung. Das ist also ein Platz für einen bestimmten Basistypen oder für eine Referenz.
b) Der Zuweisung.

Also Du kannst sagen: Ich brauche einen Parkplatz. Dann bekommst Du diesen, aber Du musst nicht sofort ein Auto drauf stellen.

Also kannst Du die Variable in der Klasse als Instanzvariable definieren:
Java:
int[] numberArray;
Das ist dann also der Parkplatz. Und so lange Du da nichts drauf stellst, ist der Parkplatz leer (null).

In dem Konstruktor kannst Du nun sozusagen ein Auto auf den Parkplatz stelle:
Java:
numberArray = new int[dimension];
(Das natürlich erst, nachdem Du in dimension die benötigte Dimension zugewiesen hast.

Und als Anmerkung: Diese Befehle machen nichts:
Java:
        this.dimension = dimension;
        this.numberArray = numberArray;
dimension ist ja die Instanzvariable und somit weist Du den Wert aus der Instanzvariable ihr selbst zu.
Das Gleiche gilt für numberArray.

Solche Konstrukte sind nur dann wichtig, wenn die Instanzvariable hinter einer lokalen Variable versteckt wurde.

Also die Vergleiche hinken jetzt massiv. Aber ich baue mal einen, damit Du es evtl. etwas verstehst:
Du hast eine Geldbörse in der Tasche. Nun kann man Dir sagen (Methodenaufruf): Nimm das ganze Geld aus "der" Geldbörse und steck es in "deine" (entspricht dem this!) Geldbörse.
Da Du nur eine Geldbörse, nämlich Deine, hast, ist für die die Referenzierte Geldbörse natürlich Deine Geldbörse.
Und wie ich gesagt habe: Es ändert sich nichts. Du kannst das ganze Geld aus Deiner Geldbörse nehmen um es dann wieder hinein zu tun. Danach hast Du das gleiche Geld wie zuvor.

Nun ändern wir den Methodenaufruf - der bekommt einen Parameter "Geldbörse". Das bedeutet also: Wir drücken Dir eine andere Geldbörse in die Hand und sagen wieder: Nimm das ganze Geld aus "der" Geldbörse und steck es in "deine" (entspricht dem this!) Geldbörse.
Nun hast Du schon eine Geldbörse in der Hand, also bei "der" Geldbörse nimmst Du nun diese. Aber Deine Geldbörse ist immer noch die, die Du in der Tasche hast. Also hier ändert sich was: Dadurch dass ich dir meine Geldbörse in die Hand gedrückt habe, habe ich sozusagen Deine Geldbörse "versteckt". ==> Du willst auf eine Geldbörse zugreifen und heya: Hast ja schon eine in der Hand. Somit nimmst Du das Geld aus meiner Geldbörse, die ich dir in die Hand gedrückt hatte, raus. Nun sollst Du es in Deine Geldbörse packen. Die ist natürlich in Deiner Hosentasche und die kennst Du auch ganz genau! Und schwups: Jetzt hast Du da auch mein Geld mit drinnen ....

Das wäre also in Java ausgedrückt:
Java:
public class LeeSin {
  private Geldboerse geldboerse; // Deine Geldbörse in Deiner Tasche!

  public void transferGeld(Geldbörse geldboerse) {
    // geldboerse ist nun die Geldboerse, die Dir in die Hand gedrückt wurde!
    // Die Instanzvariable ist versteckt und kann nur noch mit this.geldboerse angesprochen werden!
    this.geldboerse.add(geldboerse.takeOutAll());
  }
}
Hoffe, das war jetzt nicht zu verwirrend.
Hey vielen lieben dank es hat mir sehr weiter geholfen, zumindest sieht mein Code jetzt mal nach etwas aus. Danke!!

Code:
public class BigInt {
    // attributes
    int dimension;
    int[] numberArray;

    BigInt(String number) {
        dimension = number.length();
        numberArray = new int[dimension];

        for (int i = 0; i < numberArray.length; i++) {
            numberArray[i] = number.charAt(i);

        }
    }

    public static void main(String args[]) {
        BigInt firstNumber = new BigInt("23");
        for (int i = 0; i < firstNumber.numberArray.length; i++) {
            print(firstNumber.numberArray[i] + " ");

        }

    }

}
Jetzt ist aktuell nur noch des Problem wie ich jetzt diese uni code zeichen umschreibe das sie zu chars werden und die richtige Ausgabe vollzieht, ich muss sagen ich habe das noch nicht ganz verstanden, wie mir der code oben weiterhilft also was da, bei mir was ist :D sorry.. ich probiere es jetzt mal weiter.

freue mich aber natürliche über jegliche Tipps und nochmals danke für die großzügige Hilfe!
 
J

JustNobody

Schau Dir dazu noch einmal #4 von @MoxxiManagarm an. Den Punkt hat er sogar mit Code gezeigt.

Edit: Sein c wäre das Zeichen, das du ausgelesen hast (er hat da als Beispiel einfach eine 3 genommen). Du kannst dir ja mal die Ergebnisse der Berechnung, die da folgt.

Und evtl. hast Du Probleme, dass da ein Zeichen abgezogen wird. Aber jedes Zeichen ist eine Zahl.
 
J

JustNobody

Wobei er immer noch eine sie ist :p
Danke für den Hinweis.

Das war mir so nicht bewusst und ich lehne es ab, da immer er/sie/es oder so zu schreiben. (Wäre es denn 'es'? Oder ist das auch beleidigend? Es wird ja niemand zu einer Sache nuf weil er kein, beide oder was weiß ich für ein Geschlecht hat ....)

Ich oute mich hiermit zu einem Zigeunerschnitzel essenden Barbaren, der als Nachtisch auch gerne mal einen Negerkuss isst. (Wobei die Empörung gespielt ist ... die Leute, die das verbieten wollen essen selbst Hamburger und Berliner ...)

Ich werde versuchen es mir zu merken, aber ich bitte um Nachsicht so es mir wieder entfallen sollte. Ich meine es garantiert nicht abwertend oder respektlos.
 
MoxxiManagarm

MoxxiManagarm

Ich werde versuchen es mir zu merken, aber ich bitte um Nachsicht so es mir wieder entfallen sollte. Ich meine es garantiert nicht abwertend oder respektlos.
Das passiert so oft, manchmal merke ich das nicht mal ^^ Eine Frau in der Entwicklung ist so Neuland wie Internet in Deutschland *hüstle*
 
A

abc66

Eine Frau in der Entwicklung ist so Neuland wie Internet in Deutschland
So selten ist eine Frau in der Entwicklung gar nicht, imho, die Mitleidsnummer zieht bei mir nicht. Habe auch noch keine männlichen Kollegen ertappt, die Frauen mit ihren Ellenbogen verletzt hätten.

Ja, das haben wir verschlafen, aber gegen die Probleme mit dem Internet kann man noch was machen
Gegen das andere auch, merkel muss Weg. (Scnr)

Ich meine seit wann entwickelt sich das ewige "Alleinregieren" eines Einzelnen nicht irgendwann suboptimal... (duck und wegrenn)

Ich oute mich hiermit zu einem Zigeunerschnitzel essenden Barbaren
Zu viel Fleisch ist ungesund (vermute ich zumindest) und nicht gut für die Umweltbilanz... Du solltest Vegetarier werden. Wenn nicht freiwillig, dann indoktriniert. :D
 
J

JustNobody

Zu viel Fleisch ist ungesund (vermute ich zumindest) und nicht gut für die Umweltbilanz... Du solltest Vegetarier werden. Wenn nicht freiwillig, dann indoktriniert. :D
Also über die Menge wurde nichts gesagt. Und wer weiß, was für Fleisch ich esse. Das mit der Umweltbilanz stimmt nur bei der Massentierhaltung.
 
Thema: 

Brauche Hilfe beim arbeiten mit Konstruktoren

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben