# Frage bzgl. char Variablen



## marcocux (28. Aug 2010)

Hallo Leute,

erstmal, HALLO AN ALLE, denn ich bin neu hier. Leider muss ich mir eingestehen, dass ich auch keine Java-Profi bin. Wir haben eine Hausaufgabe, in der es darum geht, die Wörter in einem String zu zählen.
Soweit so gut, direkt dazu habe ich keine Frage, sondern:

Ich hab den String zeichenkette angelegt, und in meine Methode:

char anzahl = " "; geschrieben

Damit wollte ich bezwecken, dass die Variable anzahl angelegt wird, welche ein Leerzeichen enthält. Allerdings erscheint beim compilieren dann folgende Fehlermeldung:

Compiliere C:\Dokumente und Einstellungen\Marco\Eigene Dateien\java\weoerter.java mit Java-Compiler
weoerter.java:41:20: incompatible types
found   : java.lang.String
required: char
     char anzahl = " ";
                   ^
1 error

---------

Woran kann das liegen?

MfG:

Marco


----------



## eRaaaa (28. Aug 2010)

" " = String
' ' = char


----------



## marcocux (28. Aug 2010)

Liebe Leute,

noch etwas - ich finde den Editieren Button nicht....!
Aber gibt es in Java danach eine Methode, welche mit erlaubt, die Variable anzahl, welche mit dem leerzeichen beschrieben ist, in meinen String zu zählen?

MfG:

Marco


----------



## eRaaaa (28. Aug 2010)

Wenn das eine Hausaufgabe ist, habt ihr doch entweder im Unterricht die Methoden durchgesprochen, oder aber eure Aufgabe ist es jetzt, euch damit mal selbst zu beschäftigen. Es macht keinen Sinn wenn wir dir jetzt alle benötigen Methoden vorschlagen....Schau dir doch mal die API Doc zu String beispielsweise an:
String (Java Platform SE 6)

Oder überlege dir, wie du selbst so eine Methode schreiben kannst! Davon hast du evtl. sogar mehr!


----------



## marcocux (28. Aug 2010)

Hallo,

also im Unterricht haben wir nur ein Teil von Methoden besprochen! Ich werds mal so probieren.
Danke sehr!

MfG:

Marco


----------



## marcocux (28. Aug 2010)

Hi,

ich hab mich eben nochmal ran gesetzt und mir eine neue Lösung überlegt:

```
import java.awt.*;
import java.awt.event.*;

public class woerter extends Frame
{
  Label ein = new Label("Eingabeband:");
  Label aus = new Label("Ausgabeband:");
  TextField einTF = new TextField (380);
  TextField ausTF = new TextField (380);
  Button b1 = new Button ("Woerter bestimmen!");

  
  public woerter (){
    setTitle("woerter");
    addWindowListener (new WindowAdapter(){
      public void windowClosing (WindowEvent evt) {    dispose(); }
    });
    setSize (500,220);
    setResizable (false);
    setLayout(null);
    setVisible (true);
    ein.setBounds(20,40,90,20); add(ein);
    aus.setBounds(20,80,90,20); add(aus);
    einTF.setBounds(140,40,250,20); add(einTF);
    ausTF.setBounds(140,80,250,20); add(ausTF);
    ausTF.setEditable(false);
    b1.setBounds(130,110,300,80); add(b1);
    b1.addActionListener (new ActionListener(){
      public void actionPerformed (ActionEvent e){
        tuewas();
      }
    });

  }
  void tuewas()
  
     {
     String zeichenkette="";

     zeichenkette=einTF.getText();
     int laenge;
     laenge = zeichenkette.length();
     int wort = 0;
     int n;
     while(zeichenkette.length()<laenge)
     {
      n = zeichenkette.indexOf(' ');
     laenge = zeichenkette.length();
     zeichenkette=zeichenkette.replace("n","");
     wort++;
     }
     wort = wort+1;
     ausTF.setText("Es sind" +wort+ "Wörter");

     }

      public static void main(String[] args)
      {
        new woerter();
      }
}
```

Problem: Es läuft nicht wie es möchte, da zeichenkette.replace anscheinend keine Variablen ersetzen kann, oder?

MfG:

Marco


----------



## XHelp (28. Aug 2010)

[JAVA=42]
     laenge = zeichenkette.length();
...
     while(zeichenkette.length()<laenge)
[/code]
Was soll denn deiner Meinung nach passieren?
Generell sollte es helfen, wenn du dir Debug-Ausgaben machst, dann siehst du wo der Fehler ist.


----------



## Final_Striker (28. Aug 2010)

ich würde einfach über den String laufen und mit 
	
	
	
	





```
charAt(int index) [/c]die Leerzeichen zählen.
```


----------



## dirk1970 (28. Aug 2010)

```
int laenge;
     laenge = zeichenkette.length();
     int wort = 0;
     int n;
     while(zeichenkette.length()<laenge)
     {
      n = zeichenkette.indexOf(' ');
     laenge = zeichenkette.length();
     zeichenkette=zeichenkette.replace("n","");
     wort++;
     }
```

bei Dir sind einige Probleme drinnen
ich vermute, Du möchtest Dir das erste Leerzeichen holen (zeichenkette.indexOf(' '), wenn Du eins gefunden hast dieses ersetzen mit leerzeichen, usw. bist Du alle Leerzeichen ersetzt hast, dabei zählst Du die Anzahl der Wörter hoch 
dass die Schleife so Unsinn ist, wurde ja bereits angesprochen, bei Deinem Vorgehen müsstest Du als Kriterium haben, n==-1, das bedeutet nämlich, dass es kein Leerzeichen mehr gibt, beim replace möchtest Du nur das eine Leerzeichen an Position n ersetzten, Dein replace würde alle n ersetzen, die er findet, soll heissen, replace erwartet das zu ersetzende als ersten Parameter und ersetzt dann alle Vorkommnisse davon (es gibt aber auch ein replaceFirst!), wie gesagt das angeben was ersetzt werden soll als ersten Parameter. Damit würde dann auch Dein Vorgehen funktionieren

Generell einfacher und sinnvoller wäre es aber, wenn Du in Deiner Schleife einfach von 0 bis Länge-1 zählst, Dir mittels charAt(index) das Zeichen geben lässt und es dann auf Leerzeichen prüfst und dann Deine wortvariable hochzählst


----------



## marcocux (28. Aug 2010)

Hi,

oke^^ neue Überlegung:


```
import java.awt.*;
import java.awt.event.*;

public class woerter2 extends Frame
{
  Label ein = new Label("Eingabeband:");
  Label aus = new Label("Ausgabeband:");
  TextField einTF = new TextField (380);
  TextField ausTF = new TextField (380);
  Button b1 = new Button ("Woerter bestimmen!");


  public woerter2 (){
    setTitle("woerter2");
    addWindowListener (new WindowAdapter(){
      public void windowClosing (WindowEvent evt) {    dispose(); }
    });
    setSize (500,220);
    setResizable (false);
    setLayout(null);
    setVisible (true);
    ein.setBounds(20,40,90,20); add(ein);
    aus.setBounds(20,80,90,20); add(aus);
    einTF.setBounds(140,40,250,20); add(einTF);
    ausTF.setBounds(140,80,250,20); add(ausTF);
    ausTF.setEditable(false);
    b1.setBounds(130,110,300,80); add(b1);
    b1.addActionListener (new ActionListener(){
      public void actionPerformed (ActionEvent e){
        tuewas();
      }
    });

  }
  void tuewas()

     {
     String zeichenkette="";
     zeichenkette=einTF.getText();
     int wort = 0;
     int x = 0;
     int n =0;
     char laenge;
     while (n=zeichenkette.lenght())
     {
       laenge = zeichenkette.charAt(x);
       if (x== )
       {
       wort++;
       }
       x++;
       x++;
     }
     wort = wort+1;
     aus.TFsetText("Es sind" +wort+ "Wörter");

     }

      public static void main(String[] args)
      {
        new woerter2();
      }
}
```

problem: Illegal Start of expression bei if(x= )... wie kann ich das leerzeichen sonst darstellen?

MfG:

Marco


----------



## Final_Striker (28. Aug 2010)

[c](laenge  == ' ')[/c]

Gewöhne dir an, ordentliche Bezeichnungen für Variablen zu verwenden.
"char laenge" für eine Variable die eine Zeichen des String enthält, macht keinen Sinn.

edit:

Wenn man die Länge eine Schleife kennt, verwendet man in der Regel for-Schleifen.


----------



## XHelp (28. Aug 2010)

[JAVA=44]
while (n=zeichenkette.lenght())
[/code]
Ist auch verkehrt


----------



## marcocux (28. Aug 2010)

Hallo,

also, besser kanns ich es leider nicht... tut mir leid... hab wohl grad ein Brett vorm Kopf! Mein Hund is nämlich grad weggelaufen - hab ihn aber wieder!


```
import java.awt.*;
import java.awt.event.*;

public class woerter2 extends Frame
{
  Label ein = new Label("Eingabeband:");
  Label aus = new Label("Ausgabeband:");
  TextField einTF = new TextField (380);
  TextField ausTF = new TextField (380);
  Button b1 = new Button ("Woerter bestimmen!");


  public woerter2 (){
    setTitle("woerter2");
    addWindowListener (new WindowAdapter(){
      public void windowClosing (WindowEvent evt) {    dispose(); }
    });
    setSize (500,220);
    setResizable (false);
    setLayout(null);
    setVisible (true);
    ein.setBounds(20,40,90,20); add(ein);
    aus.setBounds(20,80,90,20); add(aus);
    einTF.setBounds(140,40,250,20); add(einTF);
    ausTF.setBounds(140,80,250,20); add(ausTF);
    ausTF.setEditable(false);
    b1.setBounds(130,110,300,80); add(b1);
    b1.addActionListener (new ActionListener(){
      public void actionPerformed (ActionEvent e){
        tuewas();
      }
    });

  }
  void tuewas()

     {
     String zeichenkette="";
     zeichenkette=einTF.getText();
     int wort = 0;
     char x = 0;
     int n =0;
     char l;
     int l2;
     l2 = zeichenkette.length();
     while (l2<n)
     {
       l = zeichenkette.charAt(x);
       if (l==' ')
       {
       wort++;
       }
       x++;
       n++;
     }
     wort = wort+1;
     ausTF.setText("Es sind"+wort+"Wörter");

     }

      public static void main(String[] args)
      {
        new woerter2();
      }
}
```

MfG:

Marco

PS: Aber es läuft


----------



## dirk1970 (28. Aug 2010)

ist doch schon besser, kann aber noch nicht funktionieren (die Schleifenbedingung ist falsch!)

while (l2<n)
     {
       l = zeichenkette.charAt(x);
       if (l==' ')
       {
       wort++;
       }
       x++;
       n++;
     }

jetzt nur noch die BEdingung umdrehen, weil du möchtest ja solange n<als die GEsamtlänge ist was machen
dann ist x überflüssig, nimm einfach auch da n
und dann gehts
vielleich noch etwas aufräumen, sinnvolle Variablennamen und den Code sauber formatieren...


----------



## XHelp (28. Aug 2010)

dirk1970 hat gesagt.:


> vielleich noch etwas aufräumen, sinnvolle Variablennamen und den Code sauber formatieren...



Und auch selber java-tags benutzen


----------



## marcocux (30. Aug 2010)

hi,
danke nochmal!

marco


----------

