Eigener String

Ofof91

Aktives Mitglied
Hallo community,

bei meiner Hausaufgabe ist mir die Angabe nicht ganz klar.

Implement a class, which manages a string as array of characters (e.g. char[] data)

Examples:

MyString h= new MyString (new char[]{'H', 'i'});
MyString s= new MyString("Marc!");
h.concat(s);
System.out.println(h); // "Hi Marc!"
 

Ofof91

Aktives Mitglied
Du sollst eine Klasse MyString schreiben, die intern ein char[] Array vorhält.

Danke und für was kann man das char Feld brauchen? Es steht noch folgendes in der Angabe:

public MyString(char [] rawData) {..} //constructor: copies the content of rawData and sets the length depending on the number of characters in the existing array
 
S

SlaterB

Gast
> Danke und für was kann man das char Feld brauchen?

zum Speichern der Daten, die den String ausmachen?? die einzelnen Zeichen?

> //constructor: copies the content of rawData and sets the length depending on the number of characters in the existing array

setzt in der Tat auch meine Interpretationsfähigkeiten unter Probleme

vielleicht soll deine Klasse ein sehr großes char-Array fester Länge enthalten, auch wenn das auch nicht zu empfehlen ist,
in dem Fall müsste man sich merken, wie viel davon befüllt ist, also noch eine Variable length

vielleicht heißt das aber auch nur, ein eigenes char[] zu kopieren, genau in der Länge des Parameter
 
F

Firephoenix

Gast
[...]

> //constructor: copies the content of rawData and sets the length depending on the number of characters in the existing array

setzt in der Tat auch meine Interpretationsfähigkeiten unter Probleme

vielleicht soll deine Klasse ein sehr großes char-Array fester Länge enthalten, auch wenn das auch nicht zu empfehlen ist,
in dem Fall müsste man sich merken, wie viel davon befüllt ist, also noch eine Variable length

vielleicht heißt das aber auch nur, ein eigenes char[] zu kopieren, genau in der Länge des Parameter

Vermutlich wollen sie entweder das interne Array mit fixer maximalgröße das mit length beschränkt ist, oder man erzeugt ein neues Array mit der gleichen länge wie rawData.
In beiden Fällen wollen sie vermutlich auf System.arrayCopy() [EDIT]oder manuelles kopieren[/EDIT] hinaus.

Gruß
 

Ofof91

Aktives Mitglied
> Danke und für was kann man das char Feld brauchen?

zum Speichern der Daten, die den String ausmachen?? die einzelnen Zeichen?

> //constructor: copies the content of rawData and sets the length depending on the number of characters in the existing array

setzt in der Tat auch meine Interpretationsfähigkeiten unter Probleme

vielleicht soll deine Klasse ein sehr großes char-Array fester Länge enthalten, auch wenn das auch nicht zu empfehlen ist,
in dem Fall müsste man sich merken, wie viel davon befüllt ist, also noch eine Variable length

vielleicht heißt das aber auch nur, ein eigenes char[] zu kopieren, genau in der Länge des Parameter

Das Kopieren ist mittlerweile schon klar, die zweite Sache ist anscheinend, die Länge des Feldes speichern und mit einer anderen Methode dann zurückgeben.

Die Aufgabe ist mit Sätzen ausgestattet, die dir nicht wirklich weiterhelfen. Weiteres Beispiel..

// initializes the instance with characters of string a
public MyString(String a) {..}
 
S

SlaterB

Gast
diese Info ist wiederum klar wenn man die anderen sieht bzw. die Klasse an sich,
'die chars von a übernehmen', anders kann man es gar nicht ausdrücken und eine schlichte Information
 
S

SlaterB

Gast
durchlesen vielleicht,
für andere, für mich im Moment kein Widerspruch/ Problem ersichtlich, das kann man wohl zu behaupten wagen

dein MyString speichert Zeichen in einem char[],
wenn du einen String bekommst, eine bekannte Klasse die intern auch chars hat, dann sollst du die chars dort herausholen

das sind wahrlich simple Sachverhalte, die hier mühsam eingetippt werden, oder wirklich alles spanisch?
 

Ofof91

Aktives Mitglied
Vollständige Angabe:

//Constructors

//creates an empty string
public MyString(){..}

//copies the content of rawData and sets the length depending on the number of characters in the existing array
public MyString(char[] rawData){..}

//initializes the instance with characters of string a
public MyString(String a){..}

//creates a new string initialized with content of MyString a
public MyString(MyString a){..}

//methods

//returns the length of the string
public int length(){..}

//returns the saved string as an instance of java.lang.String
public String toString(){..}

// returns the starting at the character with index start to the character with index end; returns null if any of the indexes given is not valid for the string
public MyString substring(int start, int end){..}

//adds the string a to the end of the existing string
public void concat(MyString a){..}

//adds the string a2 to the end of a1 and returns the result as MyString
public static MyString concat(MyString a1, MyString a2){..}

+ compareTo-, indexOf- und trim-Methoden...

Examples:


MyString h= new MyString (new char[]{'H', 'i'});
MyString s= new MyString("Marc!");
h.concat(s);
System.out.println(h); // "Hi Marc!"
 

Ofof91

Aktives Mitglied
ja wir haben die Angabe verstanden, trotzdem musst du sie schon selber machen.
Hast du eine konkrete Frage?

Ja das ist schon klar, dass ich es selber machen muss, möchte ich auch, sonst hat das Ganze keinen Sinn.

Eine konkrete Frage, ja natürlich. Es ist sinnvoll, wenn wir es Schritt für Schritt durchgehen würden.

Der erste Konstruktor hat keinen Übergabewert, auch keinen Rückgabewert.
Sollte der etwas beinhalten? Wenn ja, was?
 
Zuletzt bearbeitet:

Ofof91

Aktives Mitglied
Wollt ihr mir nicht weiterhelfen? :)

Wenn ich mich mit der ganzen Sache jemals auskennen würde, was aber wahrscheinlich nie sein wird, würde ich jeden helfen.

Es tut einfach weh, wenn man nicht weiterkommt und sich keine Hilfe holen kann. Manche hatten anscheinend diese Erfahrung nicht.
 

Ofof91

Aktives Mitglied
Ich habe aber keine Idee, wie man ein Empty String erzeugen soll?

Etwa so:

String data="";
Wenn ja, wo kann ich dann die Variable data vewenden?
 
G

Gast2

Gast
Du musst dir auch mal deine Aufgabenstellung durchlesen. Dein "MyString" nutzt intern doch ein char[] Array. Was wäre also ein leerer String...? Genau, das hier:
Code:
data = new char[0];
 
G

Gast2

Gast
Na in allen Methoden die dein String so anbietet ;)

Fang doch einfach mal an und programmier nen paar Stunden. Wenn du dann irgendwas hast, das vorzeigbar ist, dann zeigste uns das und klärst deine restlichen Probleme.
 

ARadauer

Top Contributor
Wenn ich mich mit der ganzen Sache jemals auskennen würde, was aber wahrscheinlich nie sein wird, würde ich jeden helfen.
Klar das würdest du... ich hab aber leider nicht so viel Energie, dass ich jedem seine Aufgabe schreibe.
Wenn jemand mitdenkt und eigene Ideen einbringt, dann hilft man gerne!
Aber hier die Aufgabenstellung zu posten und zu hoffen... das wird nicht reichen...
 
F

Firephoenix

Gast
Wenn ihm immer noch nicht klar ist wozu er das char[]-Array benötigt dreht sich das hier eh im Kreis.


Nochmal zum mitschreiben:
-Ein String ist eine Abfolge aus chars
-Ein Array speichert eine Abfolge aus Einträgen fester größe (hier chars)
-In deiner Klasse verwaltest du ein solches Array
-Deine Klasse sieht intern also irgendwie so aus:

Java:
public class MyString{
private char[] chars;

//oder
private char[] chars = new char[... irgend eine feste länge ...];
private int length; //gibt an die wieviel ersten x Einträge im Array belegt sind
}
Welche Form genau du wählst hängt von deiner Aufgabenstellung und deinem Geschmack ab!

-Deine Klasse soll folgende Schnittstellen anbieten:

Java:
//creates an empty string
public MyString(){..}
Ein leerer String hat die Länge 0 und besteht aus keinen Zeichen. ist es so schwer, das in deiner Klasse abzubilden?


Java:
//copies the content of rawData and sets the length depending on the number of characters in the existing array
public MyString(char[] rawData){..}
Da steht schon 1-1 was du machen musst: Kopiere alle chars aus rawData irgendwie in deine Klasse und übernehme auch noch die länge.

Java:
//initializes the instance with characters of string a
public MyString(String a){..}
Im Thread wurde dir schon eine Methode vorgestellt wie du aus einem String ein char-Array bekommst, einen Konstruktor für ein char-Array hast du oben bereits geschrieben. Fällt dir irgend etwas auf?

Java:
//creates a new string initialized with content of MyString a
public MyString(MyString a){..}
Auf a kannst du z.B. toString() aufrufen, und mit dem String wieder deinen vorigen Konstruktor füttern -> gleiches Spiel wie oben.


Java:
//returns the length of the string
public int length(){..}
Ja, was könnte mit Länge wohl gemeint sein? Entweder die Anzahl der belegten Felder im Array / die Länge des Arrays (abhängig von deiner Implementierungsart). Semantisch: Die Anzahl der Buchstaben die du speicherst.

Java:
//returns the saved string as an instance of java.lang.String
public String toString(){..}
Mache aus dem char-array wieder einen String und gebe ihn zurück.
(Vielleicht hilft hier sogar mal ein Blick in die Doku? String (Java Platform SE 6))

Java:
// returns the starting at the character with index start to the character with index end; returns null if any of the indexes given is not valid for the string
public MyString substring(int start, int end){..}
Ich nehme mal an toString().substring zählt als mogeln, aber du schaffst es doch sicher ein neues Array der benötigten Länge zu erstellen, die benötigten Zeichen reinzukopieren und damit den char[]-Konstruktor aufzurufen oder?

Java:
//adds the string a to the end of the existing string
public void concat(MyString a){..}
Anhängen bedeutet lediglich die aktuellen Daten zu behalten, Platz für die alten und die neuen Daten zu schaffen (Tipp: a hat auch eine length()-Funktion), dann beide zusammenzukopieren und die alten Daten mit den kombinierten Daten zu überschreiben.

Java:
//adds the string a2 to the end of a1 and returns the result as MyString
public static MyString concat(MyString a1, MyString a2){..}
Wenn du die Methode vor der vorigen erledigst sparst du dir viel arbeit, dann kannst du nämlich in der nicht-statischen Methode einfach auf die statische zurückgreifen (conctat(this,a);).

Jetzt sollte aber langsam mal Code kommen oder ein Angebot in der Jobbörse gegen Geld.

Gruß
 

Bernd Hohmann

Top Contributor
das sind wahrlich simple Sachverhalte, die hier mühsam eingetippt werden, oder wirklich alles spanisch?

Ich finde die Aufgabenstellung recht spannend - mal was anderes als "Mercedes extends Auto".

Es soll einfach nur eine abgespeckte Version von "String" entwickelt werden. Für einen Anfänger eine gute Fingerübung um ordentliche Tools zu bauen.

Bernd
 

Ofof91

Aktives Mitglied
Naja recht viel weitergekommen bin ich nicht...

Hauptprogramm:

Java:
public class Str {

    
    public static void main(String[] args) {
        
        MyString a = new MyString();
        MyString b = new MyString(new char[]{'H','a','a','a'});
        MyString c = new MyString("World");
        
    }
}


Klasse MyString:

Java:
public class MyString {

    int stringlength;  
    char[] data;
    
    // creates an empty string
    public MyString()
    {
     data=new char[0];  
    }
    
    /* copies the content of rawData and sets the length depending on the number
     * of characters in the existing array */
    public MyString(char[] rawData)
    {
     data=rawData;   
     this.stringlength=data.length;
     System.out.println(data);
    }
    
    // initializes the instance with characters of string a
    public MyString(String a)
    {
     data=a.toCharArray();
     this.stringlength=data.length;
     System.out.println(data);
    }
    
    // creates a new string initialized with the content of MyString a
    public MyString(MyString a)
    {
     MyString newstring=a;
    }
    
    // returns the length of the string
    public int length()
    {
     return stringlength;
    }
 
 
}
 
G

Gast2

Gast
Fragen? Wenn ja welche?

Ein paar Hinweise:
Java:
int stringlength;
Brauchst du nicht unbedingt. Die Länge deines Strings kannst du mit dem char[] Array bestimmen.

Java:
    // creates a new string initialized with the content of MyString a
    public MyString(MyString a)
    {
     MyString newstring=a;
    }
Der Konstruktor macht keinen Sinn. Du erstellst ne Variable die sofort wieder verfällt. Laut dem Kommentar solltest du eher folgendes machen:
Java:
this.data = a.data;
Besser noch: Eine Kopie des Arrays erstellen, damit du den anderen MyString nicht beeinflusst.

Dir fehlen auch noch viele Methoden.
 

Landei

Top Contributor
Na das ist doch schon ein Anfang!

Ich würde die Länge übrigens immer aus der Länge des char-Arrays ermitteln. Es ist schwer, zwei Datendingse immer synchron zu halten - einmal bei einer Methode vergessen, dass sich damit die Länge ändert, schon hast du einen ganz gemeinen, schlecht zu findenden Bug.

Mal eine gestraffte Version mit ein paar kleinen Verbesserungen:

Java:
public class MyString {
    private char[] data;
    
    // creates an empty string
    public MyString() {
      data=new char[0];  
    }
    
    /* copies the content of rawData and sets the length depending on the number
     * of characters in the existing array */
    public MyString(char[] data) {
      this.data=data;   
    }
    
    // initializes the instance with characters of string a
    public MyString(String a) {
      data=a.toCharArray();
    }
    
    // creates a new string initialized with the content of MyString a
    public MyString(MyString that) {
      this.data = that.data;  //wenn MyString unveränderlich ist, ansonsten müsste kopiert werden, z.B. mit System.arraycopy
    }
    
    // returns the length of the string
    public int length() {
     return data.length;
    }

    @Override
    public String toString() {
        return new String(data); 
    }
}

Das Problem, dass ich mit der Aufgabe habe ist: dass sie nur am Rande mit OOP zu tun hat...
TT

Die Aufgabe wäre wesentlich spannender, wenn man als interne Datenstruktur keine Arrays oder Collections verwenden dürfte.
 
Zuletzt bearbeitet:

Ofof91

Aktives Mitglied
Vorerst vielen Dank an alle, einige Sachen habe ich nicht verstanden.

Java:
public class MyString {
    private char[] data;

Warum private?

Java:
    // creates a new string initialized with the content of MyString a
    public MyString(MyString that) {
      this.data = that.data;  //wenn MyString unveränderlich ist, ansonsten müsste kopiert werden, z.B. mit System.arraycopy
    }

Hier verstehe ich den Code nicht, was steht im "that.data" drinnen?

Java:
    @Override
    public String toString() {
        return new String(data); 
    }
}

Und sowas ist mir überhaupt neu, was soll außerdem mit "@Override" erreicht werden?
 
G

Gast2

Gast
Weils guter Stil ist. Die Variable muss nach außen hin nicht sichtbar sein.

Hier verstehe ich den Code nicht, was steht im "that.data" drinnen?
that.data ist das char[] Array der MyString Instanz that.

was soll außerdem mit "@Override" erreicht werden?
Das signalisiert dem Compiler, dass du vor hast eine Methode zu überschreiben. In diesem Fall die toString() Methode aus Object.
 

Ofof91

Aktives Mitglied
Was kann z.B. ein Übergabeparameter vom Typ MyString sein? Wenn ich vom Hauptprogramm aus, auf diesen Konstruktor zugreifen möchte?

Java:
    // creates a new string initialized with the content of MyString a
    public MyString(MyString that) {
      this.data = that.data;  //wenn MyString unveränderlich ist, ansonsten müsste kopiert werden, z.B. mit System.arraycopy
    }
 
G

Gast2

Gast
Na eine MyString Instanz natürlich.
Den Konstruktor
Code:
public MyString(String a) {
rufst du doch auch mit einem String (genauer: einer String Instanz) auf. Genau das gleiche gilt auch für den anderen Konstruktor.
 

Ofof91

Aktives Mitglied
Na eine MyString Instanz natürlich.
Den Konstruktor
Code:
public MyString(String a) {
rufst du doch auch mit einem String (genauer: einer String Instanz) auf. Genau das gleiche gilt auch für den anderen Konstruktor.

So in etwa?

Java:
MyString c = new MyString(new MyString("World"));
 
G

Gast2

Gast
Ja.
Probier doch solche Sachen bitte eigenständig aus. Wenns Fehler gibt (die du nicht selbst lösen kannst!) dann fragste nochmal nach.
 

Ofof91

Aktives Mitglied
Ok vielen Dank, eine Frage habe ich noch...

Java:
return new String(data);

Was passiert hier genau?
 

Ofof91

Aktives Mitglied
Die substring-Methode habe ich mittlerweile auch schon, vorerst aber ohne Fehlerbehandlung. Ich habe bezüglich der Ausgabe eine Frage, wenn ich die System.out.println jeweils bei den Konstruktoren "MyString"(), "MyString(char[] raw Data)" und "MyString(String a)" weglasse, dann wird nichts ausgegeben, nur ich verstehe nicht, warum ich das beim letzten Konstruktor nicht brauche?

Ausgabe:

Hallo
nice
World
nice
al

Java:
public class Str {

    
    public static void main(String[] args) {
        
        MyString a = new MyString();
        MyString b = new MyString(new char[]{'H','a','l','l','o'});
        MyString c = new MyString("nice");
        MyString d = new MyString(new MyString("World"));
        String e=c.toString();
        System.out.println(e);
        MyString f=b.substring(1,3);   
        
    }
}


Java:
public class MyString {
    private char[] data;
    
    // creates an empty string
    public MyString() {
      data=new char[0];  
      System.out.println(data);
    }
    
    /* copies the content of rawData and sets the length depending on the number
     * of characters in the existing array */
    public MyString(char[] rawdata) {
      this.data=rawdata; 
      System.out.println(data);  
    }
    
    // initializes the instance with characters of string a
    public MyString(String a) {
      data=a.toCharArray();
      System.out.println(data);
    }
    
    // creates a new string initialized with the content of MyString a
    public MyString(MyString a) {
      this.data = a.data;  
    }
    
    // returns the length of the string
    public int length() {
     return data.length;
    }
 
    @Override
    public String toString() {
        return new String(data); 
    }

   /* returns the string starting at the character with index start (inclusive)
     * to the character with index end (exclusive); returns null if any of the
     * indexes given is not valid for the string
     */
    public MyString substring(int start, int end)
    {
     String newdata=new String(data); 
     String sub=newdata.substring(start,end);
     MyString substr=new MyString(sub);
     return substr;
    }
}
 
Zuletzt bearbeitet:

Ofof91

Aktives Mitglied
Die substring-Methode habe ich mittlerweile auch schon, vorerst aber ohne Fehlerbehandlung. Ich habe bezüglich der Ausgabe eine Frage, wenn ich die System.out.println jeweils bei den Konstruktoren "MyString"(), "MyString(char[] raw Data)" und "MyString(String a)" weglasse, dann wird nichts ausgegeben, nur ich verstehe nicht, warum ich das beim letzten Konstruktor nicht brauche?


Weiß jemand warum das so ist?
 
G

gst

Gast
Sysouts haben eh nichts in Konstruktoren oder überhaupt in einer String-Klasse zu suchen.
 

Ofof91

Aktives Mitglied
Das es mit der Ausgabe etwas zu tun hat, ist schon klar, aber was ich meine ist nicht das.

Wenn ich im Hauptprogramm auf die einzelnen Konstruktoren zugreife, wird ohne System.out.. nichts ausgegeben, außer beim letzten Konstruktor, bei dem ich kein System.out..habe, aber dennoch etwas ausgegeben wird.

Java:
MyString d = new MyString(new MyString("World"));


Sysouts haben eh nichts in Konstruktoren oder überhaupt in einer String-Klasse zu suchen.

Zur Überprüfung, ob auf die einzelnen Konstruktoren zugegriffen wird?
 
Zuletzt bearbeitet:
G

gst

Gast
Im letzten Konstruktor wird garantiert nichts ausgegeben. Die Ausgabe kommt vom Aufruf des Konstruktors
Java:
MyString(String a)
Zur Überprüfung, ob auf die einzelnen Konstruktoren zugegriffen wird?
Aha. Du siehst doch am Code welchen Konstruktor du aufrufst.
 

Neue Themen


Oben