# Bestimmes zeichen im String zählen



## Fivvy (5. Sep 2005)

Hallo Leute!
Hab ein Problem und zwar will ich aus einem String = "Sers wie gehts?" mit einem Programm ausgeben wieviele "e" in diesem String vorhanden sind. Also als augabe dann "3".
Habe jetzt schon mit indexof charAt usw. rumprobiert aber auf keine wirkliche lösung gekommen.
Könnt ihr mir weiterhelfen?
mfg Fivvy


----------



## Sky (5. Sep 2005)

Wo ist denn das Problem? Ein Schleife läuft von 0 bis Länge des Strings und guckt mittels chartAt an jeder Position, ob ein 'e' drin steht. Bei jeder Fundstelle eine Zählvariable um eins erhöhen!


----------



## Guest (5. Sep 2005)

```
"Sers wie gehts?".replaceAll("[^e]","").length()
```


----------



## Guest (5. Sep 2005)

Vielen Dank, es hat geklappt.


----------



## Sky (5. Sep 2005)

Anonymous hat gesagt.:
			
		

> Vielen Dank, es hat geklappt.


Dumme Frage: Hast Du auch verstanden, warum es geklappt hat. Deiner Aussage entnehme ich erst mal nur, dass Du den Code kopiert und eingefügt und sodann als lauffähig betrachtet hast.


----------



## fivvy (5. Sep 2005)

Verstanden hab ich es auch. Den Befehl ReplaceAll kenne ich. Kenne nur nicht "[^].
Nur wenn ich bei meinem String am Anfang einen Großbuchstaben habe, zählt er ihn nicht mit, und ich kann ja  nicht schreiben 

replaceAll.("[^s, S]", "") oder sowas, oder?


----------



## The_S (5. Sep 2005)

Hi fivvy :wink: ,

wie wärs mit toUpperCase()? [insider] Wenn das der Sierl hören würde, dass du sein tolles String my String Kapitel vergessen hast ... [/insider]


----------



## bygones (5. Sep 2005)

[^] bedeutet alles außer. d.h. [^e] ist alles außer e. Willst du mehrer ausschließen einfach dranhängen. In deinem Fall also [^eE].

mehr darüber: http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html


----------



## fivvy (5. Sep 2005)

[edit by stevg]
##### (auf wünsch entfernt)


----------



## The_S (5. Sep 2005)

fivvy hat gesagt.:
			
		

> Oh nein der _zensiert_!!!!
> danke!


 :roll: 

Ja, ich verfolge dich überallhin ...


----------



## Guest (5. Sep 2005)

fivvy hat gesagt.:
			
		

> Verstanden hab ich es auch. Den Befehl ReplaceAll kenne ich. Kenne nur nicht "[^].
> Nur wenn ich bei meinem String am Anfang einen Großbuchstaben habe, zählt er ihn nicht mit, und ich kann ja  nicht schreiben
> 
> replaceAll.("[^s, S]", "") oder sowas, oder?


[^eE] 

^ negiert die Auswahl. Im Klartext heisst es "NICHT e oder E". 
Alle Zeichen, bis auf die zwei, fallen durchs Raster.
Schau dir die Beschreibung in der API-Doku zu java.util.regex.Pattern an.
Viel Spaß beim E-Zählen. :bae:


----------



## Guest (5. Sep 2005)

@deathbyaclown
Du Mutant mit 12 Fingern warst schneller. :wink:


----------



## meez (5. Sep 2005)

Hier hast du noch eine Methode aus meiner persönlichen Sammlung , die keine Regexe benutzt und deshalb auch in einer mehr oder weniger akzeptablen Geschwindigkeit läuft (Zudem funzt sie auch für mehr als 1 Zeichen):



```
public int countPattern(final String s, final String pattern) {
		int i = 0;
		final int length = pattern.length();
		for (int n = 0 - length; (n = s.indexOf(pattern, n + length)) > -1; i++);
		return i;
	}
```


----------



## fivvy (6. Sep 2005)

vielen dank euch allen!!!!
Hab aber mit diesem String das nächste Problem!
Will jetzt den String quasi in der Ausgabe selber schreiben und dann zählen lassen wie viel z. B. wieder "s" enthalten sind. Dazu brauche ich hab bufferedReader und Inputreader und so weiter.
Mit dem folgenden Code klappt es irgendwie noch nicht.


```
import java.io.*;
 
 public class Listing0203
 {
   public static void main(String[] args)
   throws IOException
   {
     int a, b, c;
     BufferedReader myString = new BufferedReader(
                          new InputStreamReader(System.in));
 
     System.out.println("Bitte geben Sie einen Text ein: ");
     a = Integer.parseInt(myString.readLine());
     
     int result;
	 result = myString.replaceAll("[^p]", "").length();
	    
	    System.out.println(result);
   }
}
```


er bringt mir da die Fehlermeldung:

cannot find symbol method replaceAll(java.lang.String,java.lang.String)

Wäre toll wenn mich jemand im Code verbessern könnte!!!!

_L-ectron-X hat die Code-Tags eingefügt._


----------



## The_S (6. Sep 2005)

Naja, myString ist ja auch kein String sondern ein BufferedReader!

[edit] OK, das war jetzt der klugscheißkommentar, jetzt ein paar ernsthafte verbesserungsvorschläge:

Warum castest du deinen eingegeben String in ein int? du musst den String in dem der eingegeben Text gespeichert ist mit replaceAll bearbeiten, nicht den BufferedReader!


----------



## fivvy (6. Sep 2005)

Danke Kiesel,
da hast du eigentlich recht. Wüsste jetzt aber nicht, wie ich es richtig hinbekomme.


----------



## The_S (6. Sep 2005)

```
String temp = myString.readLine();
int result = temp.replaceAll("[^e]", "").length();
```


----------



## fivvy (6. Sep 2005)

das ist super, aber das programm verlangt von mir zahlen und keine Buchstaben wenn ich meinen String schreiben will. Wieso das??? Versteh ich nicht!!!!


----------



## Bleiglanz (6. Sep 2005)

cannot find symbol method replaceAll(java.lang.String,java.lang.String) 

du hast wahrscheinlich Java < 1.4? da gibts da nämlich nicht


----------



## The_S (6. Sep 2005)

fivvy hat gesagt.:
			
		

> das ist super, aber das programm verlangt von mir zahlen und keine Buchstaben wenn ich meinen String schreiben will. Wieso das??? Versteh ich nicht!!!!



definier das mal genauer! Ist das eine Vorgabe von deinem Ausbilder, oder sagt dir der Compilier das? Wenn ja, was sagt er genau? Wie willst du Zeichen in nen Integer packen?

@ bleiglanz er hat das JDK 5, da es ja schonma mit replaceAll funktioniert hat!


----------



## fivvy (6. Sep 2005)

ja der Compiler verlangt von mir zahlen, Ich will ja aber buchstaben eingeben. Ich hab mir auch schon gedacht, dass wenn ich 

Integer.parseInt(myString.readLine();

hab, dass das eigentlich nicht gehen kann. Aber wie soll der Befehl dann heißen. Statt int.


----------



## The_S (6. Sep 2005)

Warum willst den nen int haben? Was sagt dir der Compiler den genau?


----------



## fivvy (6. Sep 2005)

Ich will ja nicht unbedingt nen int haben, aber ich weiß keinen anderen Befehel außer den int, den ich benutzen kann, dass ich bei meiner Eingabe von meiner Zeichenkette Buchstaben verwenden kann.
Der Compiler sagt mir direkt nix, aber wenn ich dann auf Ausführen geh und die dos-box öffnet und geb buchstaben ein dann mäggert das Programm. und wenn ich dann zahlen eingebe, dann macht ers durch, findet natürlich nichts weil ich ja nach einem "e" suche. Kannst du mir jetzt folgen???
Hoffe mal schon denn ich bin grad ratlos und weiß mal wieder nicht mehr weiter.


----------



## The_S (6. Sep 2005)

Natürlich meckert er, wenn du ein Buchstaben eingibst, du liest die Zeile ja auch in einen Integer! Und ein Integer beinhaltet nunmal ausschließlich zahlen. Wesewegen ich mich auch die ganze Zeit frage, warum du unbedingt nen int willst.


```
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;

public class ReplaceTest {
	
	public static void main(String[] args) {
		
		int sooft = 0;
		String zeichen = "e";
		String eingabe = null;
		System.out.println("Text eingeben ...\n");
		try {
			BufferedReader buffy = new BufferedReader(new InputStreamReader(System.in));
			eingabe = buffy.readLine();
         sooft = eingabe.replaceAll("[^" + zeichen + "]", "").length();
         System.out.println("Der Buchstabe \"" + zeichen + "\" kommt " + sooft + " mal im Text\n\"" + eingabe + "\"\nvor");
		}
		catch (IOException e) {
			System.out.println("Fehler beim einlesen der Zeile");
		}
	}
}
```

damit endlich a ruh is. Frag aber wenn den Code net verstanden hast und übernehm ihn net einfach


----------



## bygones (6. Sep 2005)

ncoh als kleine Anmerkung zu dem Code von Hobbit.

Falls eine Exception geworfen wird, wird das System ausgegeben, aber dennoch fliegt danach alles um die Ohren, da er dann einfach weiter macht und eingabe = null ist....

also ich wuerde z.b. im catch block das programm beenden

ausserdem - warum noch das "e" dranhaengen ? ich dachte das war nur ein bsp. wenn er z.b. nur "a' haben will verfaelscht es ja das ergebnis...


----------



## The_S (6. Sep 2005)

deathbyaclown hat natürlich recht. Hatte das nur zuerst anders und mir dann überlegt, wenn ichs mit Variablen mach ists besser und dann vergessen alles auszubessern. Ich bessers gleich mal aus ...

@ deathbyaclown thx!


----------



## fivvy (6. Sep 2005)

Also verstanden hab ich das programm schon, bis auf ein paar kleine Feinheiten!!!

Erkläre mir bitte mal die Zeile 1 und 2. 
Was bedeuten die Zeilen da oben überhaupt mit dem import. Weiß zwar wann ich sie brauch aber die Sierl hat das nie so richtig erklärt.

Dann die Zeile 11 mit dem null.
Was geht da vor sich.

und die Zeile 12.
Was ist \n????

Vielen Dank schon mal im Voraus. Kriegst ein Kaffee oder so wenn wir wieder schule haben.


----------



## The_S (6. Sep 2005)

Zeile 1 und 2 importiert die Klassen BufferedReader und InputStreamReader. Da Java nicht Standardmäßig alles importiert an Klassen, was es gibt, musst du die meisten von Hand importieren. Du könntest auch statt den 1. 3 Zeilen einfach


```
import java.io.*;
```

schreiben.

In Zeile 11 erstelle ich einen Null-String. d. h. der String hat keinen Wert zugewießen, weil er null ist, aber es wird verhindert, dass der compiler meckert, dass die Variable nicht initialisiert seien könnte.

"\n" heißt einfach nur Absatz. "\n\n" ist dann eine Leerzeile usw. usf.

Trink doch keinen Kaffee, bring lieber n Bier mit. Gschmarr, lass stecken. Wenn ich jedesma was für meine Hilfe will, wär die Nadine ja schon arm :wink:


----------



## fivvy (6. Sep 2005)

Alles klar, danke so weit.
Aber eine Frage habe ich noch.

Zur Zeile 21 in der Ausgabe:

System.out.println("Der Buchstabe \"" + zeichen + "\" kommt " + sooft + " mal im Text\n\"" + eingabe + "\"\nvor");

So, was bedeuten die ganzen """" und \\\\.
Weißt du zufällig, wo es im Internet oder so einen deutschen Befehlszeichensatz mit Erklärung für Java gibt.
Wäre nämlich für mich sicherlich sehr hilfreich.


----------



## Guest (6. Sep 2005)

Zähle gleich mal alle Zeichen. 

```
class CharCounterInputStream extends FilterInputStream {
  private int stats[];
  
  public CharCounterInputStream(InputStream in) {
    super(in);
    stats = new int[256];
    Arrays.fill(stats, 0);
  }
  
  public int read() throws IOException {
    int c = super.read();
    if(c != -1)
      stats[c & 0xFF]++;
    return c;
  }

  public int read(byte[] b, int off, int len) throws IOException {
    int n = super.read(b, off, len);
    int j = off+n;
    for(int i=off; i<j; i++)
      stats[b[i] & 0xFF]++;
    return n;
  }

  public int getAmountOf(char c) {
    return stats[c];
  }
}
```


----------



## The_S (6. Sep 2005)

Kauf dir ein Anfängerbuch. Gibts hier viele Empfehlungen. Oder ein kostenloses im Internet, gibts hier auch Empfehlungen. Ich persönlich hab mit Java 2 in 21 Tagen gelernt. Ansonsten gibts halt noch die API auf Englisch, aber ein FI/AE sollte sowieso gut englisch können :wink: .


```
String str = "\""; // Anführungszeichen
String str = "Eine Variable Zahl " + variableZahl // Verknüpft einen String mit einer Variablen, in diesem Fall trägt die Variable den Namen variableZahl
```


----------



## fivvy (6. Sep 2005)

Hab mir heute ein Buch bestellt, das heißt: Der Einstieg in Java. Denke mal das es auch gut ist. Ist ne Cd dabei usw.
Also danke mal.


----------



## fivvy (6. Sep 2005)

Es bleibt doch keine ruhe Kiesel!!!!

Mein Ausbilder will jetzt zusätzlich, dass wenn ich eine Zeichenkette schreibe dass als 2. Abfrage dann kommt, was für einen Buchstaben ich zählen will. Also hab ich nun noch einen BufferedReader gemacht und noch einen try und catch block gemacht. Aber wie erzähl ich dem Programm, dass er wenn ich in der 2. Abfrage ein i will dass er aus aus dem String in Abfrage 1  mir die i zählt und nicht die e. Und dass halt ohne dass ich im Code reinschreibe dass er das i zählen soll.
Ich weiß ich nerv!!!!!


----------



## The_S (6. Sep 2005)

dafür hab ich dir doch die Variable angelegt. Mach einfach ne Userabfrage, in der der User angiebt, nach welchem Buchstaben er suchen will und ändere die Variable dementsprechend ab. Würd übrigens keine zwei try-catch Blöcke machen, sondern den einen in ne for-Schleife setzen.

BTW: Seit wann lernst du eigentlich Java?


----------



## Fivvy (6. Sep 2005)

hab ja eine neue userabfrage in der der user angibt, welche variable er zählen will. Aber es kann ja sein, dass der user einen string schreibt und dann sich einen buchstaben zählen will. Jetzt weiß ich ja vorher nicht welche variable er suchen will, deshalb kann ich ja nicht in den code "s" schreiben weil es ja sein könnte, dass der user ein t will.
Wie soll ich die Variable denn umändern? Kann ja nicht "a-z" oder so schreiben!!
Lerne java seit letzem Jahr in der Schule habe aber da nichts gecheckt wie du ja weißt, deshalb will ich jetzt mir das mal so gut wie möglich aneignen, damit ich es ein bisschen besser verstehe.


----------

