# contains



## holzgriff (6. Apr 2011)

Hi,
ich hab folgende Aufgabe bekommen:
Es soll überprüft werden, ob String2 in String1 vorkommt. Das ganze jedoch ohne Funktionen wie contains, IndexOf usw...
Ich versuche schon seit 2 Stunden diese Aufgabe umzusetzen, allerdings bisher ohne Erfolg.
Hier mal mein momentaner Code:

```
public static boolean contains (String s1,String s2) {
					
		for(int i = 0; i < s2.length(); i++) {
				if(s1.charAt(0) == s2.charAt(i)) {					
					for(int j = 1; j < s2.length(); j++) {
						if(!(s1.charAt(j) == s2.charAt(i++))) {
							return false;
						}
					}
				}
			}
			return true;
		}
```
Würde mich über Hilfe bzw. Tipps freuen 
Gruß


----------



## SlaterB (6. Apr 2011)

gar nicht schlecht, aber noch einiges zu tun, ganz am Ende muss return false stehen,
das return true z.B. ans Ende des äußeren if (wenn die innere Schleife nicht mit false abbricht, dann ist der String gefunden)

auf Spielereien wie s2.charAt(i++) solltest du verzichten, wird erst i erhöht oder erst charAt() ausgeführt?
erhöhe i entweder vorher oder nachher, dann ist es eindeutig

> if(s1.charAt(0) == s2.charAt(i)) {  
hier vergleichst du immer den ersten Buchstaben von s1, willst du nicht eher s1 komplett durchlaufen? 
i sollte zu s1 gehören, j zu s2,



ok, das wird langsam richtig viel zu ändern


----------



## holzgriff (6. Apr 2011)

Super, Vielen Dank! 
War wohl teilweise durch vorherige Aufgaben nicht mehr ganz so konzentriert 
Mein Code sieht jetzt so aus :

```
public static boolean contains (String s1,String s2) {
					
		for(int i = 0; i < s1.length(); i++) {
				if(s1.charAt(i) == s2.charAt(0)) {					
					for(int j = 1; j < s2.length(); j++) {
						++i;
						if(!(s1.charAt(i) == s2.charAt(j))) {
							return false;
						}
					}
					return true;
				}
			}
			return false;
		}
```
Wenn man jetzt allerdings einen String 1 ("abababc") und einen String 2 ("abc") hat, dann bricht er ja bei String 1 nach dem ersten "ab" ab und gibt false aus.
Kann man das irgendwie verhindern und das Programm quasi bis zum Ende weiterlaufen lassen?
Meine Idee, die ich dazu hatte ist allerdings nicht variabel, d.h. man muss vorher wissen, wie viele "Wiederholungen" es gibt
Meine Idee:
Man lässt in der ersten for-schleife einfach noch eine variable mitlaufen und erhält somit die Möglichkeit, wenn die 2te schleife abbricht eine neue zu starten, um genau an der Stelle (an der der erste Buchstabe des 2ten Strings gefunden wurde) weiter zu machen
LG


----------



## SlaterB (6. Apr 2011)

mit folgender Erweiterung funktioniert dein Testfall noch, ein kürzerer aber nicht mehr, da das zweite a verbraucht wird,

es hilft auch nicht unbedingt, sich nur um das letzte Zeichen des Abbruchs zu kümmern, wie das dritte Beispiel zeigt,
das internen i++ ist wohl nicht so gut, lieber eine neue Variable dort,
von jedem Zeichen i aus aus komplett neu testen, das ist wohl auch deine Idee, ja



```
public class Test
{
    public static void main(String[] args)
    {
        System.out.println(contains("abababc", "abc"));
        System.out.println(contains("ababc", "abc"));
        System.out.println(contains("aaaaaac", "aaaaac"));
    }


    public static boolean contains(String s1, String s2)
    {
        for (int i = 0; i < s1.length(); i++)
        {
            if (s1.charAt(i) == s2.charAt(0))
            {
                boolean found = true;
                for (int j = 1; j < s2.length(); j++)
                {
                    ++i;
                    if (s1.charAt(i) != s2.charAt(j))
                    {
                        found = false;
                        break;
                    }
                }
                if (found) return true;
            }
        }
        return false;
    }
}
```


----------



## holzgriff (6. Apr 2011)

Alles klar
Mal vielen Dank für deine Hilfe


----------

