# Ermitteln, ob ein String y in einem String x enthalten ist



## Carole (3. Aug 2005)

Hallo!
Ich muss in 2 wochen eine java-klausur nachschreiben und hab jetzt ein problem bei dem ich nicht mehr weiterkomme... ich hoffe jemand von euch kann mir helfen... hier sind angabe und provisorische lösung( die nicht klappt  :cry:   ( war alles ursprünglich auf französisch, ich versuch mal das zu übersetzen...)

Schreiben sie eine Methode "Teil", die heraussucht ob ein String y in einem String x enthalten ist. Man muss kontrollieren ob alle in y enthaltenen Buchstaben in der gleichen Reihenfolge in x sind ( es können aber auch zusätzliche Buchstaben dazwischen geschoben sein). x muss also mindestens so lang sein wie y. ( die Methode substring ist nicht zu gebrauchen). Diese Methode soll dann true zurückgeben, falls y ein Teil von x ist, und false ansonsten.
Titel der Methode: public boolean Teil (String x, String y)


Und hier was ich bis jetzt versucht habe...



```
import cs1.Keyboard;

public class Buchstaben
{
	public boolean Teil ( String x, String y)
  {  
	   
        boolean found = false; 
        String wort = x;
        String gesuchteswort = y;
        
           for ( int i = 0; i < wort.length(); i++)                                         
             for ( int j = 0; j < gesuchteswort.length(); j++)                       
             if ( wort.charAt(i) == gesuchteswort[j])    // hier liegt mein grösstes problem..... 
                                                                          //array required but string found.... 
             found = true;               
           
             else
             i++;
            
           
            if (found)
           return wort [i];
           else
           return 0;
          
          
     }
     
     
    
    public static void main (String[] args)
     {
        String x = "abcUdefCghiL";
        System.out.println ("geben sie bitte ein wort ein");
        String y = Keyboard.readString ();
        int found;
        found = Teil (x, y);
        if ( found != 0)
        System.out.println ("das wort" +found + " wurde gefunden");
        else
        System.out.println ("das wort wurde nicht gefunden");
        System.out.println ("");

      
     }   
}
```

_L-ectron-X hat den Titel geändert._


----------



## Ives (3. Aug 2005)

Wenn ich´s richtig verstanden habe sollte folgendes reichen:

- Prüfen gegen null
- if (x.indexOf(y) != -1) .....
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#indexOf(java.lang.String)


----------



## L-ectron-X (3. Aug 2005)

Unter Java 1.5 wäre es recht einfach eine solche Methode zuschreiben:

```
public boolean teil(String x, String y) {
  return x.contains(y);
}
```
Aber du sollst sicher selbst eine Methode entwerfen, oder?

Edit: Dieser Ansatz liefert dir ein true, wenn der gesamte String y in x enthalten ist. Er muss genau übereinstimmen.


----------



## KISS (3. Aug 2005)

etwa sowas?


```
public static boolean partOf(final String source, final String part)
    {
        final StringBuffer regexp=new StringBuffer(".*");
        for(int index=0; index<part.length(); index++)
        {
            regexp.append(part.charAt(index));
            regexp.append(".*");
        }
        return source.matches(regexp.toString());
    }
```


----------



## Carole (3. Aug 2005)

wir hatten nur einen kurs von 30 stunden, es müsste also eigentlich ganz einfach sein... und ich weiss dass wir mit charAt arbeiten müssen...


----------



## Beni (3. Aug 2005)

Noch ein Versuch:


```
public boolean find( String big, String small ){
  int index = 0;

  for( int i = 0, n = big.length(); i<n && index < small.length(); i++ ){
    if( big.charAt( i ) == small.charAt( index ))
      index++;
  }

  return index == small.length();
}
```

Erklärung: jedesmal wenn ein Buchstabe von "small" gefunden wurde, geht der Zähler um eins hoch. Wenn also der Zähler am Schluss gleich der Anzahl Zeichen in "small" ist, dann wurden alle Zeichen gefunden. Da die Schleife nur einmal durchlaufen wird, müssen die Zeichen auch in der richtigen Reihenfolge in "big" sein. Wie in der Aufgabenstellung angegeben, macht es nichts, wenn "small" in mehreren Teilen aufgeteilt vorkommt.


----------



## Bleiglanz (3. Aug 2005)

wenn du mal regexe lernen willst

```
public static void main(String[] args) {
		System.out.println(test("blei", "Ableitung"));
	}

	private static boolean test(String in, String host) {
		char[] inchars = in.toCharArray();
		StringBuilder regexsb = new StringBuilder();
		for (int i = 0, n = inchars.length; i < n; i++) {
			regexsb.append("[^").append(inchars[i]).append("]*").append(
					inchars[i]);
		}
                regexsb(".*");
		return (host.matches(regexsb.toString()));
	}
```
macht aus der Eingabe blei den Regex

```
[^b]*b[^l]*l[^e]*e[^i]*i.*
```
(und funktioniert nicht für alle Strings, wegen der Sonderzeichen)


alternativ und robuster (und wahrscheinlich so gedacht) ist ne rekursive Lösung

```
private static boolean test2(String in, String host) {
		if("".equals(in)) return true;
		if(in.length() > host.length()) return false;
		if(in.equals(host)) return true;
		char firstchar = in.charAt(0);
		final int pos = host.indexOf(firstchar);
		if(pos>=0){
			return test2(in.substring(1),host.substring(pos+1));
		}else{
			return false;
		}
	}
```


----------



## Beni (3. Aug 2005)

Nur mal um sicherzugehen:


> ( es können aber auch zusätzliche Buchstaben dazwischen geschoben sein)


Bedeutet z.B.: 

```
test( "hallo", "ao" ) == true
```
?


----------



## Carole (4. Aug 2005)

ich glaub diese regexe ist mier doch ein bisschen zu kompliziert... bin halt die totale anfängerin   
ich habs gestern abend noch weiter versucht aber es klappt immer noch nicht... hab jetzt nur meinen anfangsfehler gelöst ( den den ich als kommentar angegeben hatte), aber das macht es auch nicht viel besser  :? 
auf jeden fall schon mal vielen dank für eure hilfe!



```
public boolean find( String big, String small ){ 
  int index = 0; 

  for( int i = 0, n = big.length(); i<n && index < small.length(); i++ ){ 
    if( big.charAt( i ) == small.charAt( index )) 
      index++; 
  } 

  return index == small.length(); 
}
```

wie schreibt man hierzu die main?  danke!


----------



## The_S (4. Aug 2005)

:bahnhof: ? Ganz normal, wie du sie sonst auch schreibst!? Ich denk ma du willst dein find boolean gleich ausführen. Also so


```
public static void main(String[] args) {
   deinProg prog = new deinProg();
   prog.find(string1, string2);
}
```

[edit] ach kack, du hast ja nen boolean. Setz for das prog.find noch nen boolean in dem du das Ergebnis speicherst


----------



## Bleiglanz (4. Aug 2005)

oder noch besser

```
public static void main(String[] args) {
      // find ist die static testmethode
     System.out.println(find(args[0],args[1]));
}
```

kann man dann einfach mit 

java DieKlasse blei Abkleistern

testen


----------



## Carole (4. Aug 2005)

DANKE!!!
Probier ich gleich mal aus!


----------



## Carole (4. Aug 2005)

VIELEN DANK!!!!!!!!!!!!!!!!!!!!
es klappt!


----------

