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

Status
Nicht offen für weitere Antworten.

Carole

Mitglied
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...


Code:
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.
 
I

Ives

Gast
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

Gesperrter Benutzer
Unter Java 1.5 wäre es recht einfach eine solche Methode zuschreiben:
Code:
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

Bekanntes Mitglied
etwa sowas?

Code:
    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

Mitglied
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...
 
B

Beni

Gast
Noch ein Versuch:

Code:
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

Gesperrter Benutzer
wenn du mal regexe lernen willst
Code:
	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
Code:
[^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
Code:
	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;
		}
	}
 
B

Beni

Gast
Nur mal um sicherzugehen:
( es können aber auch zusätzliche Buchstaben dazwischen geschoben sein)
Bedeutet z.B.:
Code:
test( "hallo", "ao" ) == true
?
 

Carole

Mitglied
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!


Code:
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

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

Code:
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 :oops:
 

Bleiglanz

Gesperrter Benutzer
oder noch besser
Code:
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
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben