# Häufigkeit von Buchstaben



## Feras (9. Jan 2015)

Hi, ich habe ein Programm geschrieben, welches mir die Häufigkeit aller Buchstaben eines zuvor eingegebenen Satzes ausgeben soll. Dies soll in der Methode countLetter in einer Schleife geschehen, die per return count solange count ausgibt bis alle Buchstaben des Alphabets abgearbeitet wurden. Nun habe ich jedoch eine Fehlermeldung in der Methode countLetter. Diese besagt: " This method must return a result of type int". Aber die Variable count ist doch ein integer? Was soll mir dieser Fehler sagen?

MfG Feras


```
import java.util.Scanner;


public class Aufgabe2_2a {
	
			public static int countLetter(String cipher) {
				
				int index = 0;
				String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
				char letter = alphabet.charAt(index);
				
				cipher = cipher.toLowerCase();		
				letter = Character.toLowerCase(letter);		
				int count = 0;
		 
				for(int i = 0; i < alphabet.length(); i++)	{
					
				
				for (int k = 0; k < cipher.length(); k++) {
					
					char currentLetter = cipher.charAt(k);
					if (currentLetter == letter)
						count++;			
				}
				
				index++;
		 
				return count;
			}
		}

	public static void main(String[] args)	{
		
		String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		int index = 0;
		
		Scanner input = new Scanner(System.in);

		System.out.println("Geben Sie bitte den Text ein: ");
		String cipher = input.nextLine();		
		
		char aktbuchstabe = alphabet.charAt(index);
		
		
		for(int i = 0; i < alphabet.length(); i++)	{
			
		System.out.println(aktbuchstabe +" = ");System.out.print(countLetter(cipher));
		
		}

	}

}
```


----------



## Saheeda (9. Jan 2015)

Wenn alphabet die Länge 0 hat, werden die Schleifen nicht durchlaufen und nix zurückgegeben. Es muss aber für jeden denkbaren Fall einen Rückgabewert geben.


----------



## Gucky (9. Jan 2015)

Ein unbedingtes return in einer Schleife macht keinen Sinn, denn wird die Schleife betreten, so wird schon nach dem ersten Durchlauf abgebrochen. Eigentlich müsste der Compiler eine "Dead Code" oder "unreachable Code" Meldung ausgeben.


----------



## Feras (9. Jan 2015)

Saheeda hat gesagt.:


> Wenn alphabet die Länge 0 hat, werden die Schleifen nicht durchlaufen und nix zurückgegeben. Es muss aber für jeden denkbaren Fall einen Rückgabewert geben.



Also reicht es aus diesen Fall mit einer if-agfrage abzufangen? Da bleibt der Fehler bestehen :/


----------



## Tarrew (9. Jan 2015)

Du kannst dein count auch einfach außerhalb der for-Schleife returnen.


----------



## Feras (9. Jan 2015)

ok, dafür musste ich jetzt die for Schleife aus der countLetter Methode in die main verlegen. Jetzt habe ich das Problem, dass count bei jedem Durchlauf einen reset erhalten muss (soll ja von neu anfangen zu zählen), dass war mit der static methode nicht möglich. Daher habe ich die Methode in public int countLetter umbenannt und erhalte in Zeile 44 den Fehler "Cannot make a static reference to a non-static methode counterLetter(String cipher, char buchstabe)" Wie kann ich dies lösen?


```
import java.util.Scanner;

public class Aufgabe2_2a {

	public int countLetter(String cipher, char buchstabe) {

		int index = 0;
		String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		char letter = alphabet.charAt(index);

		cipher = cipher.toLowerCase();
		letter = Character.toLowerCase(letter);
		int count = 0;

		for (int k = 0; k < cipher.length(); k++) {

			char currentLetter = cipher.charAt(k);
			if (currentLetter == letter)
				count++;
		}

		index++;

		return count;
		
		
	}

	public static void main(String[] args) {

		String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		int index = 0;

		Scanner input = new Scanner(System.in);

		System.out.println("Geben Sie bitte den Text ein: ");
		String cipher = input.nextLine();

		for (int i = 0; i < alphabet.length(); i++) {

			char aktbuchstabe = alphabet.charAt(index);

			System.out.println(aktbuchstabe + " = "
					+ countLetter(cipher, aktbuchstabe));

			index++;

		}

	}

}
```


----------



## Tarrew (9. Jan 2015)

Du musst dir ein Objekt erzeugen um die Methode auszuführen.

Aufgabe2_2a a = new Aufgabe2_2a();
a.counterLetter(...). Habe deinen Code mal getestet und der gibt immer für jeden Buchstaben "2" aus. 

Das ganze kann man übrigens auch wesentlich effezienter schreiben. Ich habs auch mal probiert: 

```
public class Test {
	String alphabet = "abcdefghijklmnopqrstuvwxyz";
	public int[] countLetter(String cipher) {
		cipher = cipher.toLowerCase();
		int[] anzahl = new int[26];
		for (int i = 0; i < cipher.length(); i++) {
			char aktChar = cipher.charAt(i);
			int arrayPos = alphabet.indexOf(aktChar);
			anzahl[arrayPos]++;
		}
		return anzahl;

	}

	public static void main(String[] args) {

		Test test = new Test();
		Scanner input = new Scanner(System.in);

		System.out.println("Geben Sie bitte den Text ein: ");
		String cipher = input.nextLine();

		int[] result = test.countLetter(cipher);
		for (int i = 0; i < result.length; i++) {
			System.out.println(test.alphabet.charAt(i) + " = " + result[i]);
		}

	}
}
```

Du nimmst dir einfach ein int-Array mit 26 Einträgen. Für jeden Buchstaben gibt es ein Feld im Array. Dann gehst du nur 1x dein Wort durch und zählst jeweils für jeden Buchstaben den dementsprechenden int-Wert aus dem Array hoch.


----------



## Gucky (9. Jan 2015)

Du musst die for-Schleife nicht in die main verlegen.


```
public int methode(String str)
  for das Schleifengedöns...{

  }
  return irgendeinenWert;
```


----------

