Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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
> 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
> //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.
> 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) {..}
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
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
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?
Damit du lernst wie du mit arrays umgehst...
Also natürlcih ist die aufgabe sinnlos, aber es ist halt eine spielerei um dich mit der sprache vertraut zu machen...
//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!"
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:
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.
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...
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.
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;
}
}
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);
}
}
Zum erlernen des Verständnis ist das vollkommen unerheblich. Sinniger wäre dann vielleicht eine andere Sprache wie z.B. TurboPascal die gar kein OOP kennt...
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?
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
}
Und es steht das, was übergeben wird drinnen? Welches der Variable data zugewiesen wird? Und die Funktion toCharArray() darf man in diesem Fall nicht verwenden, weil es vom Datentyp her kein String ist?
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;
}
}
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?
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.