Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

Länge eines String zurückliefern lassen?

also ich bin hier echt am verzweifeln,

mit public int length() soll man sich doch angeblich die länge eines Strings angeben lassen oder? aber ich krieg den mist nicht auf die Reihe

hab jetzt schon alles ausprobiert was mir eingefallen ist:

public int length (String name)

{ return length; }

geht nicht...er fragt dann immer noch nach dem zu verwendendem Namen was ich nicht check warum...und selbst wenn ich "aslöfdhowie" eingebe, ist das Ergebnis stets 0 ?

häää? muss ich da was vom Instanzname abhängig machen? ich dreh hier gleich ab...und werf dieses Sche*ßbuch ins Feuer


Quelltext:


/**
 * Diese Klasse definiert Studenten in einem Uni-Verwaltungssystem.
 * Sie beschreibt die Details von Studenten, die für unseren Kontext
 * relevant sind.
 *
 * @author  Michael Kölling und David J. Barnes
 * @version 1.0  (3. Januar 2003)
 */
public class Student
{
    // der volle Name des Studierenden
    private String name;
    // seine Matrikelnummer
    private String matrikelnummer;
    // die Anzahl der bereits erworbenen Scheine
    private int scheine;
    //von mir eingefügt
    private int length;

    /**
     * Erzeuge einen neuen Studenten mit Name und Matrikelnummer.
     */
    public Student(String vollerName, String matrNr)
    {
        name = vollerName;
        matrikelnummer = matrNr;
        scheine = 0;
    }

    /**
     * Liefere den vollen Namen dieses Studenten.
     */
    public String gibName()
    {
        return name;
    }

    /**
     * Trage einen neuen Namen ein.
     */
    public void nameAendern(String neuerName)
    {
        name = neuerName;
    }

    /**
     * Liefere die Matrikelnummer dieses Studenten.
     */
    public String gibMatrikelnummer()
    {
        return matrikelnummer;
    }

    /**
     * Erhöhe die Anzahl der erworbenen Scheine.
     */
    public void erhoeheScheinanzahl(int weitereScheine)
    {
        scheine += weitereScheine;
    }

    /**
     * Liefere die Anzahl der bereits erworbenen Scheine.
     */
    public int gibScheinanzahl()
    {
        return scheine;
    }

    /**
     * Liefere den Login-Namen. Der Login-Name ist eine Kombination der
     * ersten vier Buchstaben des Namens mit den ersten drei Ziffern der
     * Matrikelnummer.
     */
    public String gibLoginName()
    {
        return name.substring(0,4) + matrikelnummer.substring(0,3);
    }
   
    /**
     * Gib Name und Matrikelnummer auf der Konsole aus.
     */
    public void ausgeben()
    {
        System.out.println(name + " (" + matrikelnummer + ")");
    }
   
    public int length()
   
    {
       return length;
    }
}


Antworten zu Länge eines String zurückliefern lassen?:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hi |

Deine Methode müsste schon wissen, wovon sie die Länge ausgeben soll. Auf die Deklaration der Variable "length" kannst du höchstwahrscheinlich verzichten.

Nehmen wir an, du willst die Länge des Strings "name" (als Objektvariable) zurückgeben lassen von der Funktion length() (übrigens keine clevere Namenswahl, weil Verwechslungsgefahr mit java.lang.String.length(), was wir gleich verwenden werden): dann kriegst du die Länge mit

this.name.length();

Wenn du deine Methode so beibehalten willst, also mit Parameterübergabe, dann bietet es sich an, sie als static zu delarieren. Würde alles in allem dann so aussehen:


// der Parameter "name" hat NICHTS mit dem gleichnamigen Attribut der Klasse zu tun!
public static int length(String name)
{
  return name.length();
}

Die ganze Aktion ist aber sinnfrei, weil die length()-Methode aus java.lang.String sowieso ohne weiteres Zutun zur Verfügung steht. Du kannst also z.B. irgendwo schreiben:

String foo = "bar";
System.out.println(foo.length());

...und das ganz ohne deine eigene Methode.

greez 8)
JoSsiF


P.S. Bitte beim Posten von Quellcode immer den BB-Tag "code" verwenden, sonst scrollt man sich 'nen Wolf, vor allem dann, wenn du gleich mal 'ne ganze Klasse postest.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

aha...werde das mal probieren...bin halt nach dem tollen Buch vorgegangen und da steht man sollte die sondierende operation
public int length() benutzen...


name.length...warum komm ich nicht auf sowas? ::)

naja ich probier das jetzt mal aus


DANKE!! 8)


edit:

ok soweit geht´s ja, allerdings soll er mir gleich die länge des namens des neuen Studenten ausgeben ohne das ich erst den namen angeben muss...
mmh...ich probiers mal noch bissle...

« Letzte Änderung: 31.12.06, 17:09:46 von Hunne »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

ok...soweit so gut...klasse lässt sich übersetzen, jetzt bekomme ich jedoch beim initialisieren eine Null-point Exception


    private int Nlänge = name.length(); (nämlich hier?)
    private int MNr = matrikelnummer.length();
   
   

    /**
     * Erzeuge einen neuen Studenten mit Name und Matrikelnummer.
     */
    public Student(String vollerName, String matrNr)
    {
        {
        name = vollerName;
        matrikelnummer = matrNr;
        scheine = 0;
    }
   
    if (Nlänge < 4)
        {
            System.out.println("bla");
        }
    if (MNr < 3)
        {
            System.out.println("bla2");
        }
    }


habs auch schon mit vollerName probiert aber das geht auch nicht...was is nu schon wieder falsch? ich check das mal überhaupt net...

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Du versuchst, die Länge eines nicht vorhandenen Strings zu ermitteln. Wenn du Klassenvariablen deklarierst, solltest du noch keine Wertzuweisung machen, außer es handelt sich um Konstanten. Dazu gibt's ja dann Methoden - in dem Fall bieten sich die klassischen Getter und Setter an.

Also: erst Instanz der Klasse erzeugen. Das ist ja Sinn der ganzen Sache ;)

greez 8)
JoSsiF

Hallo,
ich schließe mich meinem Vorschreiber an. Desweiteren empfehle ich Dir das Buch "Java - ist auch eine Insel", welches Du Dir kostenlos bei Galileo-Computing in der Rubrik <openbook> runterladen kannst. Gewöhne Dir bitte ein paar Standards an. Anstatt gibName() solltest Du getName(), sowie aendereName(String name) sollte setName(...) heißen. Das ist ein Quasi-Standard, der zwar nicht eingehalten werden muß, sich aber durchgesetzt hat. Schließlich sprechen wir bei Komponenten-Klassen immer von getter und setter-Methoden. Auch sollte man beim Zugriff auf Klassenattribute die Referenz per this-Zeiger machen.
Viel Erfolg noch

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

get und gib ist doch vollkommen wurscht wie das heißt...das das Buch was ich hier hab totaler Müll ist hab ich auch schon gemerkt...

allerdings bleibt es bei der Frage:

wie krieg ich es hin das bei bzw. nach der Initialisierung geprüft wird ob der Name & Matrikelnummer auch lang genug ist...also nur Prüfung...ansonsten soll er das ruhig übernehmen...achja, laut der Aufgabe soll ich das direkt in den Konstruktor schreiben  ???

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Nichts einfacher als das:

Du solltest wissen...
- was der Konstruktor ist
- wie du die Länge eines Strings ermittelst (siehe vorherige Antworten)
- wie ein if-Konstrukt funktioniert

Der Rest beschränkt sich auf das, was im Falle einer negativen Überprüfung erfolgt (z.B. eine Ausgabe). Aber das kannst du ja erstmal ignorieren.

Das kriegst du hin, oder?

greez 8)
JoSsiF

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

nee irgendwie nicht weil ich ja nicht weiß wie ich die Prüfung machen soll...

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
int minLength = 3;
if (this.name.length() < minLength)
{
  // Prüfung nicht erfolgreich, mach irgendwas...
}

So schwer? ;)

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

also JoSsif, das ist so, in dem Buch (bei dem ich jetzt am Ende vom 2. Kapitel bin) steht halt nur dieser public int length Befehl und mit dem soll man das halt bewerkstelligen...das was du da geschrieben hast ist mir gänzlich unbekannt und ich hab sowas auch vorher noch nicht gelesen...fang ja grade erst mit JAVA an

also ich denk mal man soll das auch nur mit diesem Befehl dann auf die Reihe kriegen und mit ner if - Bedingung oder so...mmmh...weiss jetzt echt nicht was ich von dem "tollen" Buch, das uns unser Informatik Professor auch noch empfohlen hat halten soll...

hast du evtl noch ne andere Idee wie ich das machen kann oder geht das nur so wie du es geschrieben hast?

naja ich werd das mal so einbauen wie du mir geheißen hast  ;) Danke soweit!

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

OK... :)

Ich weiß zwar jetzt nich genau, ob du (bzw. das Buch) eine Methode "length" oder ein Attribut "length" haben willst (oder gar beides), aber ich habs in dem Fall mal so gebaut, dass du eine Methode "length" hast, die dir die Länge des Namens der aktuellen Instanz von Student zurückgibt. Im Konstruktor wird die Methode wie gewünscht aufgerufen und mit einem Mindestwert verglichen (hab ich kurzerhand mal davor deklariert; ist nicht die feine Art, aber funzt). Ist der String zu kurz (hab ich mal so provoziert durch Mindestlänge 30), dann wird an der Konsole eine Meldung ausgegeben.

/**
 * Diese Klasse definiert Studenten in einem Uni-Verwaltungssystem.
 * Sie beschreibt die Details von Studenten, die für unseren Kontext
 * relevant sind.
 *
 * @author  Michael Kölling und David J. Barnes
 * @version 1.0  (3. Januar 2003)
 */
public class Student
{
    // der volle Name des Studierenden
    private String name;
    // seine Matrikelnummer
    private String matrikelnummer;
    // die Anzahl der bereits erworbenen Scheine
    private int scheine;

    /**
     * Erzeuge einen neuen Studenten mit Name und Matrikelnummer.
     */
    public Student(String vollerName, String matrNr)
    {
        name = vollerName;
        matrikelnummer = matrNr;
        scheine = 0;
       
        int minNameLength = 30;
        if (this.length() < minNameLength)
        {
        System.out.println("Name ist zu kurz.");
        }
    }

    /**
     * Liefere den vollen Namen dieses Studenten.
     */
    public String gibName()
    {
        return name;
    }

    /**
     * Trage einen neuen Namen ein.
     */
    public void nameAendern(String neuerName)
    {
        name = neuerName;
    }

    /**
     * Liefere die Matrikelnummer dieses Studenten.
     */
    public String gibMatrikelnummer()
    {
        return matrikelnummer;
    }

    /**
     * Erhöhe die Anzahl der erworbenen Scheine.
     */
    public void erhoeheScheinanzahl(int weitereScheine)
    {
        scheine += weitereScheine;
    }

    /**
     * Liefere die Anzahl der bereits erworbenen Scheine.
     */
    public int gibScheinanzahl()
    {
        return scheine;
    }

    /**
     * Liefere den Login-Namen. Der Login-Name ist eine Kombination der
     * ersten vier Buchstaben des Namens mit den ersten drei Ziffern der
     * Matrikelnummer.
     */
    public String gibLoginName()
    {
        return name.substring(0,4) + matrikelnummer.substring(0,3);
    }
   
    /**
     * Gib Name und Matrikelnummer auf der Konsole aus.
     */
    public void ausgeben()
    {
        System.out.println(name + " (" + matrikelnummer + ")");
    }
   
    public int length()   
    {
       return this.name.length();
    }
   
    // Die main-Methode, wo der ganze Quatsch zur Anwendung gebracht wird
    public static void main(String[] args)
    {
    Student myStudent = new Student("Mein voller Name", "012345");
   
    System.out.println("Student \"" + myStudent.gibName() + "\" angelegt.");
    }
   
}

greez 8)
JoSsiF

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

aha...aha...also mit this.length gings nicht...habs in name.length geändert nun tuts...aber mehr mach ich heute auch nicht...muss erstmal meine elende erkältung loswerden

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
aha...aha...also mit this.length gings nicht...habs in name.length geändert nun tuts...

Hatte die Klasse 1:1 kopiert von mir...

Wenn du name.length() nimmst, brauchste aber wiederum die eigens definierte Methode length() nicht mehr.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

öh? welche Methode? funzt doch so wie ichs geändert hab...mehr will ich ja nicht, aber wenn du mir noch verraten willst was du damit jetzt genau meinst nehms ichs dir auch nicht übel...so jetzt aber genug von dem zeug...N8! ;D

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

OK, das will ich dir verraten... ;)

Mit this referenzierst du immer auf die aktuelle Instanz der Klasse. Rufst du also this.length() auf, wird auch die Objektmethode length() in dieser Klasse aufgerufen.

Nutzt du jetzt allerdings name.length(), so wird die Methode legth() aus java.lang.String aufgerufen, also eine Methode, die Java schon mit sich bringt. Das hängt damit zusammen, dass name vom Typ String ist, und deswegen wird auch eine Objektmethode dieser Klasse (nämlich java.lang.String) aufgerufen. Siehe hier: http://java.sun.com/j2se/1.4.2/docs/api/

Das Ergebnis ist für dich freilich das gleiche, weil ja die length()-Methode in DEINER Klasse auch nur die length()-Methode aus java.lang.String nutzt. Nur wie gesagt wird deine Methode nicht aufgerufen, du kannst sie also getrost aus dem Quelltext löschen.

greez 8)
JoSsiF

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

 ??? sorry hab jetzt gar nix kapiert...was kann ich löschen? und warum gehts bei mir mit this.length nicht?
bin noch nicht so bewandert was JAVA und dessen Ausdrücke angeht...Beispiele wären da immer hilfreich
(wenns nicht zuviel Arbeit macht?)

also ich versteh nicht ganz wo jetzt da der Unterschied sein soll ?! bin verwirrt.... ???

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
also ich versteh nicht ganz wo jetzt da der Unterschied sein soll ?! bin verwirrt.... ???

Genau wie erklärt: der Unterschied ist, dass durch this.length die Objektmethode length() deiner eigenen Klasse aufrufst, während name.length eine Objektmethode einer völlig anderen Klasse aufruft.

So schließt sich übrigens der Kreis: ich hatte am Anfang mal irgendwo erwähnt, dass die Namenswahl "length" für den neuen Methodennamen schlecht ist (ich weiß du kannst nichts dafür, das Buch will es so). Denn die Konsequenz ist, dass du selber nicht mitbekommst, welches length() nun eigentlich ausgeführt wird.

Versuch's doch mal mit der Umbenennung der Methode in myLength(). Was dort drin steht, bleibt natürlich gleich, aber der Aufruf der Methode im Konstruktor muss natürlich angepasst werden. Vielleicht hilft dir das, den Unterschied mitzubekommen.

Kleiner Tipp: Wenn du im Konstruktor dann nach allen Änderungen name.myLength() aufrufst (analog deines jetzigen Codes), gibt's einen Fehler. Das ist der Punkt, an dem es klingeln sollte ;)

greez 8)
JoSsiF

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

nur mal zum verständnis, weil ich da jetzt nicht weiter dran rumbasteln will: *keine Zeit hab*

also:

name.length benutzt die Methode length die schon in der Javabibliothek definiert ist?
und this.length verweist auf eine Methode die ich selber definiert hab, auch wenn die dann letzlich wieder auf die Javabibliothek zurückgreift?

oder?? mmmh...steig immer noch nicht so ganz durch...naja ich mach mal die anderen Kapitel weiter vielleicht wirds dann klara äh klarer  8)

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
und this.length verweist auf eine Methode die ich selber definiert hab, auch wenn die dann letzlich wieder auf die Javabibliothek zurückgreift?

Ja sicher. Schau dir doch mal den Inhalt der Methode an.

Aber vielleicht solltest du wirklich erstmal in deinem Buch weiterlesen. Da wird mit der Zeit sicher noch einiges klar, und die Grundlagen können und wollen wir im Forum sowieso nicht vermitteln ;)

greez 8)
JoSsiF

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

jo...werd ich machen, muss ich sogar  8)

trotzdem danke, aber ich meld micht bestimmt bald wieder mit ner anfänger frage  ;)


« C++: Buch/Editor- empfehlungHandbuch Visual Basic 2005??? »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Hostname
Ein Hostname ist der eindeutige Name, der einem Gerät in einem Netzwerk zugewiesen wird. Dieser Name wird (parallel zu der IP Adresse) verwendet, um das Gerät i...

Unterlänge
In der Typographie lassen sich die einzelnen Buchstaben des Alphabets in ein sogenanntes Linienraster oder Liniensystem vertikal einfügen. Nun lassen sich drei versc...

Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...