# Zugriff auf einzelne Buchstaben eines String



## sascha123 (17. Jan 2005)

Hallo zusammen!!!
Ich habe folgendes Problem:
Ich hab ein Array namens String. In diesem Array sind die Elemente "Heute", "ist", "aber", "wirklich" und
"schönes Wetter". Jetzt würde ich gerne (innerhalb von einem Java-Programm) ausgeben, wie oft welcher Buchstabe vorkommt. Also ungefähr so:

' w ' : 1
' s ' : 3  usw...

Das bekomme ich aber leider nicht hin! Es hapert schon dabei, den ersten Buchstaben vom ersten Element zu bestimmen. Wie referenziere ich auf den? Ich vermute mal irgendwas in die Richtung CharAt(index).String[0] ??? Es klappt halt einfach nicht und ich würde mich sehr über eure Hilfe freuen!

Vielen Dank im Vorraus,

sascha.


----------



## The_S (17. Jan 2005)

Alles in Char Arrays packen, vergleichen, mitzählen


----------



## thE_29 (17. Jan 2005)

Array[0].charAt(0)

vielleicht


----------



## sascha123 (17. Jan 2005)

wow, das ging ja schnell! 
is aber leider zu unverständlich für mich!
trotzdem danke! 
also ich bräuchte da eigentlich einmal ansatzweise wenigstens den genauen code, damit ich das dann versteh!


----------



## The_S (17. Jan 2005)

Wenn du was genaues brauchst solltest du mal deinen Code (oder zumindest zum Teil) posten.


----------



## sascha123 (17. Jan 2005)

gut, hey isn:

-----------------------------------------------------------------------


```
class Blatt9 {

    public static void main(String[] String) {

	System.out.println("Parameter:");

	for(int i = 0; i < String.length; i++) {	
	System.out.println(i + " : " +"\"" + String[i] +"\""); // Ausgabe der einzelnen Wörter in Anführungszeichen
	
	}

	System.out.println("\n\nCharacter occurrences: ");  // Wie oft hat man welchen Buchstaben???
	

	System.out.println("\nInput:");	
	for(int i = 0; i < String.length; i++) {	
	System.out.print(String[i] + " ");       // Ausgabe des Input
	
	}	

    }

}
```

------------------------------------------------------------------------

Und der Text : Heute ist aber wirklich "schönes Wetter"  wird dann in der Kommandozeile eingegeben. also nach javac Blatt9.java schreibt man dann java Blatt9 Heute ist aber wirklich "schönes Wetter" .

_ edited by thE_29: code tags!_


----------



## The_S (17. Jan 2005)

schonmal was von Codetags gehört   ? Gut der Code hilft auch nicht viel weiter! Kann grad net selbst proggen, also hier ein theoretischer Ansatz: Die Strings in ein Char Array einlesen. ne for Schleife machen, die die einzelnen Elemente vergleicht und dabei ihre häufigkeit (z. B. in einem int Array) speichert. Mehr kann ich momentan leider nicht helfen


----------



## thE_29 (17. Jan 2005)

```
String strAbc = "abcdefghijklmnopqrstuvwxyz";
    int iField[] = new int[26];  //wo die Zahlen abgespeichert werden
    for(int y = 0; y != strAbc.length(); y++)
    {
      for (int x = 0; x != strFields.length; x++)
      {
        int iCnt = 0;
        for (int z = 0; z != strFields[x].length(); z++)
        {
          if (strFields[x].charAt(z) == strAbc.charAt(y))
            iCnt++;
        }
        iField[y] += iCnt;
      }
    }
for(int x = 0; x != iField.length; x++)
    {
      System.out.print(strAbc.charAt(x));
      System.out.print(" = ");
      System.out.println(iField[x]);
    }
```

gegebenenfalls die Arrays und das anfangsabc anpassen!


----------



## mic_checker (17. Jan 2005)

Wird so aber noch net funzen -> strFields ....

soll nicht zwischen groß/kleinschreibung unterschieden werden? Falls ja ist iField zu klein....


----------



## mic_checker (17. Jan 2005)

Hier mein Ansatz:

Man geht die einzelnen Strings im Array der Reihe nach durch...In ner inneren Schleife geht man die einzelnen Buchstaben des jeweiligen Strings durch (siehe charAt(int index)).
Anschließend kann man das int Array nach Bedarf inkrementieren:


```
public class CountVokal2
{
	public static void main(String[] args)
	{
   	String[] test = {"Heute","ist","aber","wirklich","schönes","Wetter"};
    	int iField[] = new int[26];  
    	char ch;
	    
    	for(int y = 0; y < test.length; y++)
    	{
			for(int c = 0;c < test[y].length();c++)
			{
				ch = test[y].charAt(c);
				
				/*
				* Kleine Denksportaufgabe:
				* Was muss hier hin? ;)
				*/
			}
		}
		
		for(int i = 0;i < iField.length;i++)
			System.out.println((char)(i+65) + " = "+iField[i]+" mal");
	}
}
```

Groß/Kleinschreibung nicht beachtet. Das "umzustellen" ist Kinderspiel....Ein bissl Code muss noch rein, aber das ist kein prob...überleg halt einfach mal.

Hoffe du meintest es so..code müsste eigentlich funzen, ansonsten bitte posten.


----------



## sascha123 (18. Jan 2005)

vielen dank erstmal an alle für die schnellen antworten!!!

ich werde gleich mal versuchen, den code von mic_checker zu verstehen und zu verändern!
DANKE für die Denksport-Aufgabe  :wink:


----------



## mic_checker (18. Jan 2005)

Also die Vorgehensweise ist ja prinzipiell nicht sehr kompliziert.

In der äusseren for durchläufst du die Elemente des Arrays, in der inneren for durchläufst du jeden Buchstaben des zugehörigen Elementes des Arrays (Strings)...

In der "Denksportaufgabe" fehlt noch ne if..else...Bedingung - wobei das auch recht klar sein sollte was da rein kommen muss.

ansonsten kannst ja immer noch posten.

btw. für groß/kleinschreibung zu unterscheiden, ist das ganze nicht großartig anders,nur das dein iField größer sein muss...und der Block der Bedingung etwas anders aussieht.


----------



## sascha123 (18. Jan 2005)

hm... 
sorry, aber das ist echt noch ein kleines bißchen zu hoch für mich. bin wirklich ganz blutiger anfänger! da muss ich wohl bei deiner denksportaufgabe passen. also irgendwie ( weil du ja geschrieben hast "noch ne if...else...Bedingung) muss da ja noch was rein, was überprüft, ob der aktuelle buchstabe (args_.charAt(c) ) schon einmal vorgekommen ist. wenn ja, dann wird ch an dieser stelle um eins erhöht, und wenn nicht, muss man wieder in die innere for-schleife bzw. in die äußere, falls das wort zu ende ist?! wäre nett, wenn du mir das noch schreiben und erklären könntest_


----------



## mic_checker (18. Jan 2005)

Also was musst du dadrin überprüfen? 

Theoretisch wäre es möglich das z.B. Satzzeichen etc. drin vorkommen.

Also schaust du nach ob der Buchstabe zwischen a ... z , bzw. A...Z liegt.

Könnte dann in etwa so aussehen:


```
if(ch >= 65 && ch <= 90)
			   iField[ch % 65]++;
		   else if(ch >= 97 && ch <= 122)
			   iField[ch % 97]++;
```


----------



## sascha123 (18. Jan 2005)

vielen vielen dank für die hilfe mic_checker.
klappt wunderbar, bis auf eine kleinigkeit.
würde das gerne noch so abwandeln, dass die buchstaben,
die überhaupt nicht vorkommen, auch am ende nicht ausgegeben werden. das hab ich allerdings leider noch nicht erreicht. auf jeden fall, danke für deine hilfe!!!
sascha


----------



## mic_checker (18. Jan 2005)

```
for(int i = 0;i < iField.length;i++)
			if(iField[i] > 0)
				System.out.println((char)(i+65) + " = "+iField[i]+" mal");
```

Erklärung: Wenn ein best. Buchstabe im Text auftaucht (Groß oder Klein), wird der entsp. Wert inkrementiert. Also nur schauen ob der Wert an der Stelle i vorher inkrementiert wurde....sprich ob er größer als 0 ist.


----------



## sascha123 (18. Jan 2005)

ok, dann noch einmal vielen dank!
jetzt klappt alles wunderbar, wie ich`s haben wollte!!!
find ich cool, dass du dich mit für dich vielleicht lachhaften poblemen auseinander setzt. in ca. 4-5 jahren helf ich dir dann auch ma ;-)

gruß sascha


----------

