# Buchstaben position in einem Wort ausgeben



## KleinerZwerg (16. Jan 2017)

Hallo, ich soll ein Programm schreiben, der mir die Position von einem bestimmten Buchstaben anzeigt, jedoch habe ich irgendwo einen Denkfehler.. 
Würde mich auf Hilfe sehr freuen..

class MZKett
{
 static int [] buPos(String x, char bu)
  {
    int l=x.length();
    char c[]=x.toCharArray();

    for (int i=0; i<l ;i++ ) 
    {
      if (c (i) ==bu) {
      return (i);  
      } // end of if
    } // end of for
  }      


class MZKettAnw08
{
  public static void main(String args[])
  {
    String x= "Hippopotomonstrosesquippedaliophobie";
    char bu= 'o';

    int Pos= MZKett.buPos(x, bu);
    System.out.println(Pos);    
  }
}


----------



## Robat (16. Jan 2017)

KleinerZwerg hat gesagt.:


> if (c (i) ==bu)



Auf ein Array greift man mit den eckigen Klammern [] zu und nicht mit den runden 

Also `c[i] == bu`

Gruß
Robert[/i]


----------



## KleinerZwerg (16. Jan 2017)

Robat hat gesagt.:


> Auf ein Array greift man mit den eckigen Klammern [] zu und nicht mit den runden
> 
> Also `c[I] == bu`
> 
> ...




Hey, also ich bin selbst dann drauf gekommen, nur meckert der mir noch beim return(i); , da es kein Array ist, also da steht 

MZKett.java:25:15: error: incompatible types: int cannot be converted to int[]
      return (i);  
              ^
1 error


----------



## Robat (16. Jan 2017)

KleinerZwerg hat gesagt.:


> static int [] buPos(String x, char bu)



Du willst ja sicherlich auch kein array zurückgeben, oder?


----------



## KleinerZwerg (16. Jan 2017)

Robat hat gesagt.:


> Du willst ja sicherlich auch kein array zurückgeben, oder?


Das ist so vorgegeben....


----------



## Robat (16. Jan 2017)

Was steht denn in der Aufgabenstellung ??


----------



## KleinerZwerg (16. Jan 2017)

a) Programmieren Sie innerhalb der Java-Klasse MUKett die folgende Methode:
static int[] buPos(Stringx, char bu)
Diese Methode gibt alle Positionen zurück, an denen der Buchstabe bu innerhalb der Zeichenkette x vorkommt.


----------



## KleinerZwerg (16. Jan 2017)

und b) In der main()-Methode der Klasse ZKettAnw wird die Methode buPos() für die erste Komponente des Rückgabefelds der Methode einZKFeld () und einen konstanten Buchstaben aufgerufen. Alle gemäß a) ermittelten Positionen werden dann ausgegeben.

einZKFeld ist von einer anderen Aufgabe die übernommen werden soll und sieht so aus:

 static String[] einZKFeld()
  {
    String zkf[]= {"Hallo","wie","geht","es","dir?"};      
    return zkf;      
  }


----------



## Robat (16. Jan 2017)

Aha da haben wir es doch 

Du musst deine Methode also um folgendes erweitern:

- ein int[] Array anlegen. (Max Länge ist die Länge des Wortes)
- eine Laufvariable anlegen, die mitzählt an welcher Stelle du im Array gerade bist
- anstatt return i schreibst du array[k] = i;
- am ende gibst du array zurück.



Spoiler: Lösung





```
static int [] buPos(String x, char bu)
{
    int l = x.length();
    char c[]=x.toCharArray();
    int[] array = new int[l];
    int k = 0;

    for (int i=0; i<l ;i++ )
    {

        if (c[i] ==bu) {

            array[k] = i;
            k++;

        } // end of if

    } // end of for

    return array;
}
```




Nachteil an der ganzen Sache ist eben, das dein Array größer sein kann als die eigentliche Anzahl der Buchstaben. Dafür gibt es eigentlich Listen aber davon mal abgesehen


----------



## KleinerZwerg (16. Jan 2017)

Ich verstehe gerade nicht, wofür ich die Methode einZKFeld benutzen soll :S
Und es funktioniert immer noch nicht wirklich...

und wieso hast du if (c (i) ==bu) { ? wird das i nicht mit eckigen Klammern umschlossen?


----------



## Robat (16. Jan 2017)

KleinerZwerg hat gesagt.:


> und wieso hast du if (c (i) ==bu) { ? wird das i nicht mit eckigen Klammern umschlossen?


Hatte es bereits geändert. Hab deinen Code einfach copy-pasted. Da hab ich nicht mehr dran gedacht, das da ein Fehler war 

Mal davon abgesehen, dass die Namen der Methoden "ungünstig" gewählt sind folgendes:

Deine Methode `einZKFeld()` gibt dir ein Array mit Strings zurück. Von diesem Rückgabewert sollst du dir das 1. Element schnappen und, zusammen mit einem Buchstaben, der Methode `buPos(String x, char bu)` übergeben.


----------



## Viktim (18. Jan 2017)

So, ich hab mir auch mal schnell eine Lösung überlegt...

```
public static void main(String[] args) {
    for (int i : buPos("TSEST", 'S')) { //Fuer jedes int in dem von buPos zurueckgegebenen Array
      System.out.println(i); //Gebe den Wert aus
    }
  }

  static int[] buPos(String string, char suche) {
    char[] chars = string.toCharArray();
    int zaehler = 0;

    // ermittelt die Anzahl des Buchstabens im String/ jetzt Array.
    for (int i = 0; i < chars.length; i++) {
      if (chars[i] == suche) {
        zaehler++; //Ist das gleiche zaehler = zaehler +1;
      }
    }

    int[] positionen = new int[zaehler]; //Neues Array, mit der anzahl der 
    // dient dazu, die richtige Stelle des positionen-Arrays auszuwaehlen
    int anzahlBuchstabenZaehler = 0;

    // ermittlt die Positionen und schreibt diese ins array
    for (int i = 0; i < chars.length; i++) {
      if (chars[i] == suche) {
        positionen[anzahlBuchstabenZaehler] = i;
        anzahlBuchstabenZaehler++; //muss auch hochgezaehlt werden, damit nicht alles in das gleiche Element (z.B. [0] des Arrays geschrieben wird.)
      }
    }

    return positionen;
  }
```


----------

