Buchstaben zählen

Hallo Leute,

Die Ausgabe soll sein A : *
B :
usw
L:**
usw

derzeitige Ausgabe ist

A :10000001000200100000000000
B :1
0000001*0002
00100000000000
C :1
00000010002**00100000000000
D :10000001000200100000000000
E :1
0000001*0002
00100000000000
F :1
00000010002**00100000000000
G :10000001000200100000000000
H :1
0000001*0002
00100000000000
I :1
00000010002**00100000000000
J :10000001000200100000000000
K :1
0000001*0002
00100000000000
L :1
00000010002**00100000000000
M :10000001000200100000000000
N :1
0000001*0002
00100000000000
O :1
00000010002**00100000000000
P :10000001000200100000000000
Q :1
0000001*0002
00100000000000
R :1
00000010002**00100000000000
S :10000001000200100000000000
T :1
0000001*0002
00100000000000
U :1
00000010002**00100000000000
V :10000001000200100000000000
W :1
0000001*0002
00100000000000
X :1
00000010002**00100000000000
Y :10000001000200100000000000
Z :1
0000001*0002
001*00000000000



    public static void main(String[] args) {

        //int buch = new buch[26];




       
        String eingabe = "HALLO";

        StringBuffer text = new StringBuffer(eingabe);

        int lang = eingabe.length();

        int buch[] = new int[26];

        	for(int i=0;i<26;i++)
        	{
        		buch**=0;

        	}

        	for (int i=0;i<lang;i++)
        	{
        		int z= (int) text.charAt(i);
        		z= z-65;
        		buch[z] =buch[z]+1;
        	}

        
	
			for(int i =65;i<=90;i++)
			{
				System.out.print((char) i +" :");
				
				 for(int j=0;j<26;j++)
        			{
        				System.out.print(buch[j]);
        				
        				if(buch[j]>0)
        				{
        					for(int k = 0;k<buch[j];k++)
        					{
        						System.out.print("*");
        					}
        				}
        	
       				}
				System.out.println();
			}
			




    }
}```

danke euch vielmals

so wie ich das sehe macht Deine Methode einfach zu viel. Die einzige Information die Du brauchst ermittelst Du in Zeile 12. Den ganzen Rest kannst Du im Wesentlichen vergessen. Das Einzige was Du davon brauchts ist die Schleife in Zeile 26 und darin die Ausgabe aus Zeile 46. Dann noch mal abschließend 'nen Zeilenumbruch nach der Schleife ausgeben und fertig…
Ich glaube, ich habe das falsch verstanden…

Also muss ich fragen: warum läufts Du in Zeile 39 nochmal duch alle Buchstaben anstatt duch die Anzahl der gezälten?

bye
TT

Sorry vorher falschen code eingegeben


	public static void main(String[] args) {

		// int buch = new buch[26];

		String eingabe = "HALLO";

		int lang = eingabe.length();

		int buch[] = new int[26];

		for (int i = 0; i < lang; i++) {
			int z = (int) eingabe.charAt(i);
			z = z - 65;
			buch[z] = buch[z] + 1;
		}

		for (int i = 65; i <= 90; i++) {
			System.out.print((char) i + " :");

			for (int j = 0; j < 26; j++) {
				

				if (buch[j] > 0) {
					for (int k = 0; k < buch[j]; k++) {
						System.out.print("*");
					}
				}

			}
			System.out.println();
		}

	}
}```

in der ausgabe habe ich bei alle Buchstaben 4 Sterne, dabei wenn buch buch[j] ==0 wird doch nicht in die Schleife gehen und deswegen auch kein stern ausgeben


> 
> A :*****
> B :*****
> C :*****
> D :*****



aber Ausgabe für HALLO soll so aussehen

A: *
B:
C:
D:
E:
...
H:*
.
.
L:**
O:*
...
Z:

Meine frage bleibt…

bye
TT

Bitte bitte Hilf mir

ich laufe nicht die Buchstaben sondern Array wo Anzahl der Buchstaben steht

[quote=anni80]Bitte bitte Hilf mir[/quote]mach ich doch… :stuck_out_tongue_winking_eye:

[quote=anni80;102663]ich laufe nicht die Buchstaben sondern Array wo Anzahl der Buchstaben steht[/quote]Ja, aber zwei mal (ineinandergeschachtelt).

bye
TT

ich belege Array mit Anzahl der Buchstaben

			int z = (int) eingabe.charAt(i);
			z = z - 65;
			buch[z] = buch[z] + 1;
		}```

zuerst gebe ich Buchstabe aus , dann laufe ich buch Array und gebe nur in dem Fall Sterne aus wenn die Anzahl der Buchstabe mehr als 0 ist
```for (int i = 65; i <= 90; i++) {
			System.out.print((char) i + " :");

			for (int j = 0; j < 26; j++) {
				
				if (buch[j] > 0) {
					for (int k = 0; k < buch[j]; k++) {
						System.out.print("*");
					}
				}

			}```

was ist hier überflüssig? wenn Buchstabe nicht vorhanden ist also  buch[j]=0 warum geht in der if (buch[j] > 0)  rein?

die äußere for-Schleife beginnt mit i=65, also A,

jetzt müsstest du lediglich buch[indexFürA] anschauen, alle anderen Array-Plätze interessieren nicht, nur dieser einer,

du durchläufst aber sämtliche Buchstaben, die j-Schleife kommt bei A vorbei, malt einen Stern, kommt bei B vorbei, malt keinen Stern, usw., insgesamt 5 Sterne,
immer, für jedes i, weil immer alle 26 Array-Plätze angeschaut werden, statt nur des einen für den aktuellen Buchstaben


statt buch[z] = buch[z] + 1; geht übrigens auch buch[z]++;,
bei Arrays mit evtl. komplizierten Index bietet sich das besonders an,
spart doppeltes Hinschreiben, vermeidet Fehler

bitte gib mir noch winzig kleine Anweisung. Mein Fehler habe ich schon verstanden

die j-Schleife muss weg, der Code darin zur Buchstaben-Verarbeitung bleibt,
aber nicht für den j-Arrayplatz, denn die j-Schleife ist ja weg, einfach den aktuell richtigen Arrayplatz ,

fange an den Code auf buch[0] umzustellen, dann läuft es schon mal ohne j,
gibt immer das an Arrayplatz 0 aus (ein Stern für A),
den richtigen Arrayplatz zum aktuellen Buchstaben i zu bestimmen, das ist deine Aufgabe,
eine Schleife j ist jedenfalls nicht dabei, i sagt den Buchstaben an -> einen Arrayplatz auswählen

komisch dass du es weiter oben so leicht geschafft hast, da hast zu z für einen Buchstaben
und kannst dann eine konkrete Arrayplatz bestimmen um diese zu erhöhen,
ganz ohne Schleife über aller Arrayplätze

ich betone das alles so bewußt, denn genau diese Aufgabe hier, dies zu lösen, ist eine der wichtigsten Programmierfähigkeiten,
solche Dinge einfach durchdenken zu können brauchst du mehr als tausend Klassen zu kennen,
die kann man alle nachschlagen, das hier nicht

Ihr seid Engeln . Danke danke danke

So schaut meine Lösung aus


for (int i = 65; i <= 90; i++) {
			System.out.print((char) i + " :");
			char buchstabe = (char) i;
			int zahl = (int)buchstabe - 65;
			if (buch[zahl] > 0 && zahl < 26) {
				for (int k = 0; k < buch[zahl]; k++) {
					System.out.print("*");
				}
				
			}
			System.out.println();
		}

Kleinigkeit:
wenn dann müsstest du die Variable buchstabe vor der Ausgabe definieren und sie dort auch verwenden statt zweimal zu casten,

aber für die Index-Berechnung brauchst du auch keinen char, zumal du gar auf i zurückcastest, was auch nicht nötig wäre, i-65 reicht wie oben z-65

die Schleife könnte freilich auch als char von ‘A’ bis ‘Z’ laufen

das if könnte auch ganz weg: wenn im Array 0 steht macht die Schleife eben gar nichts,
‘zahl < 26’ sollte (bisher) auch immer gelten

Mich stören da zwei Kleinigkeiten:

a) Die vielen Zahlen: 26, 90, 65 - man braucht sie nicht und sie machen das Programm schwerer lesbar als nötig

b) Wenn man die starre Begrenzung auf ‘A’ bis ‘Z’ aufgibt - und dafür mal eben ein wenig Speicher hergibt (was ja heute wo schon jedes Unterhemd 4GB RAM hat wirklich kein Problem mehr ist) - erhält man ein flexibleres und besser verständlichen Programm.

ist aber bei so einer Programmieraufgabe wahrscheinlich nebensächlich.

[quote=anni80]Danke danke danke[/quote]Dafür hat das Forum einen Button… ;o)

bye
TT