# Arrays  Vokale zählen



## Simon Sperlich (2. Dez 2016)

Folgendes Programm ist vorhanden


```
public class Zahlen {

public static void main(String[ ] args) {

cahr[ ] buchstaben = {'B', 'a', 'l', 'd', ' ', 'i', 's', 't',
' '; 'W'; 'e', 'i'; 'h', 'n'; 'a', 'c', 'h', 't', 'e', 'n'};

// ...
}
}
```

a) Aufgabe Zähle wie viele 'e' Zeichen Zeichen im Array buchstaben vorkommen und gibt diese Anzahl aus.

b) Wie viele Vokale(a, e,i,o, u) sind im Array buchstaben enthalten?
Es gibt mehrere Möglichkeiten, diese Aufgabe zu lösen!

ich hab ein Programm geschrieben wo die Anzahl zählt


```
//Unterricht am 17.11.2016
public class Zahlen {

   public static void main(String[] args) {
     // TODO Auto-generated method stub

     char[] buchstaben = {'B', 'a', 'l', 'd', ' ', 'i', 's', 't',
     ' ', 'W', 'e', 'i', 'h', 'n', 'a', 'c', 'h', 't', 'e', 'n'};
   
     System.out.println(buchstaben.length);
   }

}
```

weiß aber nciht wie ich die 'e' und Vokale zähle


----------



## Joose (2. Dez 2016)

Code bitte in Code-Tags schreiben, danke 
[code=java] ... dein code ...[/code]

Zu deinem Problem: Du musst mittels Schleife dein Array durchgehen und jedes char prüfen ob es ein 'e' ist. Wenn ja zählst du eine Zählervariable (am besten vom Typ int) ums 1 hoch.


----------



## Nuiton (2. Dez 2016)

Du hast mehrere Optionen (naja, mir fallen zwei ein), wie du das mit den Vokalen loesen kannst.
*Old school:*

```
public int getNumVowelsOld(char a[])
    {
        int vowels = 0;
        for (int i = 0; i < a.length; i++)
        {
            switch(a[i])
            {
                // ...
                case 'e': vowels++; break;
            }
        }
        return vowels;
    }
```
*New school:*

```
public int getNumVowels(char a[])
    {
        List<Character> listC = new ArrayList<>();
        for (char c : a)
            listC.add(c);
        return (int) listC.stream().filter((t) -> t == 'e' || t == ... etc.).count();
    }
```


----------



## mariane (2. Dez 2016)

ich glaube mit Streams und Lambda-Ausdrücken triit man deutlich aus der Masse hervor.

Man könnte auch das Ganze als String mit Regex malträtieren, also alles weg was kein 'e' ist, bzw. alles weg was kein Vokal ist, und dann die Restlänge ausgeben.

```
public static void main(String[] args)
    {
        char[] b = { 'B', 'a', 'l', 'd', ' ', 'i', 's', 't', ' ', 'W', 'e', 'i', 'h', 'n', 'a', 'c', 'h', 't', 'e', 'n' };

        System.out.println((new String(b)).replaceAll("(?ix)[^e]", "").length());
        System.out.println((new String(b)).replaceAll("(?ix)[^aeiuo]", "").length());

    }
```


----------



## Flown (2. Dez 2016)

An alle Vorposter. Bitte - ich hab das jetzt schon zig-male erwähnt - das ist ein Anfängerforum und wenn man schon mit Schleifen und Vergleiche nicht zurechtkommt, was glaubt ihr dann wie es mit Lambdas/Streams/Regex sein wird?
Zudem kommt noch hinzu das weder Regex noch Lambdas hier die optimalste Lösung sind (zumindest nicht in dieser Form die hier gepostet ist)!

Nun zu dem Problem @Simon Sperlich:
Grundsätzlich bietet sich hier an dein Problem in mehrere Teilaufgaben aufzuspalten. Einmal die Prüfungen der Buchstaben und einmal das Zählen der Vorkommnisse. Da die Lösung schon gepostet ist, werd ich diese mal ein wenig aufpeppen.

```
private static boolean isVowel(char c) {
  return 'a' == c || 'e' == c || 'i' == c || 'o' == c || 'u' == c;
}
```
Dann bietet sich auch noch die enhanced for-each Schleife an:

```
public static int countVowels(char[] chars) {
  int result = 0;
  for(char c : chars) {
    if(isVowel(c)) {
      result++;
    }
  }
  return result;
}
```



Nuiton hat gesagt.:


> Du hast mehrere Optionen (naja, mir fallen zwei ein), wie du das mit den Vokalen loesen kannst.
> *New school:*
> 
> ```
> ...


Wenn hier jeder Java 8 Code postet, dann wenigstens die optimalste Lösung (Boxing und eine Liste ist hier nicht nötig!). Entweder - auch bevorzugt:

```
public static int countVowels(char[] chars) {
  return IntStream.range(0, chars.length).filter(i -> isVowel(chars[i])).map(i -> 1).sum();
}
```
Oder:

```
public static int countVowels(char[] chars) {
  return CharBuffer.wrap(chars).codePoints().filter(Test::isVowel).map(i -> 1).sum();
}
 
private static boolean isVowel(int cp) {
  return 'a' == cp || 'e' == cp || 'i' == cp || 'o' == cp || 'u' == cp;
}
```


----------



## Nuiton (2. Dez 2016)

Jetzt hat der TE wenigstens eine Hand voller Alternativen.


----------



## Simon Sperlich (2. Dez 2016)

```
//Aufgabe aus Unterricht am 17.11.2016
public class Vokale {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        char[] buchstaben = {'B', 'a', 'l', 'd', ' ', 'i', 's', 't',
        ' ', 'W', 'e', 'i', 'h', 'n', 'a', 'c', 'h', 't', 'e', 'n'};
     
     
        int zähler = 0;
        System.out.println(buchstaben.length);
     
        for(char i = 0; i < buchstaben.length; i++){
         
            if(buchstaben[i] == 'e'){
             
                zähler++;
            }
             
            }
        System.out.println("Anzahl 'e':" + zähler);
        }
    }
```

ist Lösung von a) zwei `e`


----------



## Simon Sperlich (6. Dez 2016)

```
public class Vokale {
   public static void main(String[] args) {
     // TODO Auto-generated method stub
     char[] buchstaben = {
       'B', 'a', 'l', 'd', ' ', 'i', 's', 't',
       ' ', 'W', 'e', 'i', 'h', 'n', 'a', 'c', 'h', 't', 'e', 'n'};

     int zahlen = 0;
     for(int i = 0; i<buchstaben.length;i++) {
       if(buchstaben[I] == 'a') {
         zahlen++;   
       } else if (buchstaben[I] == 'e') {
         zahlen++;
       } else if (buchstaben[I] == 'i') {
         zahlen++;
       } else if (buchstaben[I] == 'o') {
         zahlen++;   
       } else if (buchstaben[I] == 'u') {
         zahlen++;
       }
     }
     System.out.println("Anzahl Vokale:" + zahlen);
   }
}
```
ist di Lösung für b


----------



## mariane (6. Dez 2016)

_kann man so machen, wobei das [ I ] eher ein [ i ] sein sollte, so wird es nicht funktionieren.

Wenn du so eine einfache if else if else ... Struktur hast, liegt immer ein switch case Anweisung auf der Hand, dann sehe es so aus:


		Java:In die Zwischenablage kopieren


    char[] buchstaben = { 'B', 'a', 'l', 'd', ' ', 'i', 's', 't', ' ', 'W', 'e', 'i', 'h', 'n', 'a', 'c', 'h', 't', 'e', 'n' };

    int zahlen = 0;

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

      switch( Character.toLowerCase( buchstaben[i] ) )
      {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
          zahlen++;
      }

    }

    System.out.println( "Anzahl Vokale:" + zahlen );

Character.toLowerCase(...) wandelt hier noch zusätzlich alle char in kleingeschriebene um, so das auch große Vokale mitgezählt würden, was bei deinem Beispieltext aber egal ist._


----------



## Joose (6. Dez 2016)

mariane hat gesagt.:


> kann man so machen, wobei das [ I ] eher ein [ i ] sein sollte, so wird es nicht funktionieren.


Das liegt am Forum  sofern [i] nicht zwischen Code-Tags (oder Plain-Tags) steht glaub das Forum der nachfolgende Text soll kursiv sein


----------

