Übung 10 - Fleißaufgabe String im String suchen

DasKlavier
Neuling
Neuling
Beiträge: 3
Registriert: 2. Aug 2012 15:30

Übung 10 - Fleißaufgabe String im String suchen

Beitrag von DasKlavier » 7. Aug 2012 18:21

Hi ich habe hier folgenden Code fabriziert zu der letzten Aufgabe der Übung 10 :
Ich wollte meine Idee ,die ich hatte, umsetzen. Hat aber leider net ganz geklappt : /
Ich habe jetzt den Fall "0" zur Vereinfachung weggelassen.

Code: Alles auswählen

public int indexOf(String s2) {
       
      
      int a = 0;
      int x = 0;
      
      boolean gefunden = false;
     
           if (s2.length() <= s.length()) {
           
       for (int i = 0; i < s2.length(); i++) {  
           
           if(x==1) i = 0;
          
           
           
       for (int n = 0 ; n < s.length(); n++) {
           
           if (gefunden) n = a++;  
           
           if (x == 1) { 
               n = a++;    
               x = 0;
            }
            
           if ((s2.charAt(i) != s.charAt(n)) && (gefunden == true)) {
               
               gefunden = false;
               a = n;
               x++;
               break;
                
            }     
            

           if (s2.charAt(i) == s.charAt(n)) {
               
              a = n;
              gefunden = true;
              break;
              
              
            }

        }

    }
    
    if (gefunden) {
return 1;
}
    else {
return -1;
}
    
}
  else {
      return -1;
      
    }
}
Mein Gedankengang dazu : Erstmal schaue ich ob der übergebene String kleiner oder gleich groß dem zu untersuchenden String ist ,andernfalls spuckt er -1 raus und die Sache ist gegessen.Im anderen Fall vergleiche ich jeweils das erste Element der einen Schleife mit dem anderen ersten Element (beim ersten Durchgang). Jetzt habe ich ein paar Fallunterscheidungen hier eingeführt unter der Verwendung von zuvor deklarierten Variablen ,jedoch im ersten Durchgang haben die sowieso keinen Einfluss auf die davon betroffenen Methoden weil sie alle auf null und false gesetzt sind. Wenn jetzt also der Wert des einen Strings mit dem des anderen übereinstimmt soll er die aktuelle Stelle (von String s) in a speichern , gefunden auf true setzen und die momentane Schleife abbrechen und wieder in die obige springen. Irgendwie macht er aber was ganz anderes als ich es mir erträumt habe . Naja , die anderen Fallunterscheidungen hatten folgenden Sinn : Wenn "gefunden" zuvor auf true war und jetzt die nächste Stelle vom String mit dem um eins nach rechts verschobenen "n" Wert nicht übereinstimmt soll er wieder mit dem ersten Buchstaben beginnen,indem ich quasi x auf 1 setze als Hilfsvariable, gefunden auf false und die Schleife daraufhin wieder abbrechen lasse(die zweite ). Wenn der Fall eingetreten ist , muss x den Wert 1 haben daraufhin setze ich i auf Null damit er wieder von vorne beginnt.Dieses Mal an einer anderen Stelle in dem zu untersuchenden String. Das mache ich indem ich den Wert wieder in a gespeichert hatte , rechne dann in der anderen if - Schleife dann wieder eins drauf damit es um eins nach rechts verschoben ist und von dort neu zu suchen beginnt. Am Ende soll dann gefunden auf true geblieben sein wenn er was gefunden hat ansonsten halt wieder -1. Ist es möglich mit diesem Ansatz zu machen ? Wenn der Computer das Programm ausführt ? oder sollte ich mir eine komplett neue Strategie überlegen für die Aufgabe ? Wenn ich mir die Musterlösung anschaue hab ich ja keinen wirklichen Lerneffekt ,deshalb versuche ich es so zu machen bevor ich resigniere.

Danke schon mal im voraus !

Benutzeravatar
mmec
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 203
Registriert: 7. Sep 2011 17:59
Wohnort: Darmstadt

Re: Übung 10 - Fleißaufgabe String im String suchen

Beitrag von mmec » 7. Aug 2012 18:59

Hallo DasKlavier,

ich verstehe nicht ganz wie dein Code funktioniert, vor allem nicht warum die äußere for-Schleife alle Elemente von s2 durchgeht, ich glaube dadurch machst du dir das ganze viel komplizierter. Ich hab die Aufgabe eben mal ausprobiert, mein vorgehen war alle Elemente von s,der Objektvariable, durchzugehen. Wenn der aktuelle char dann dem ersten char von s2 entspricht wird geschaut ob die folgenden Zeichen für die länge des Strings s2 sich auch noch entsprechen.
Bei mir war die Verschachtelung also umgekehrt, s außen und s2 innen.

Der Code scheint zu funktionieren, hab ihn aber nicht intensiv getestet^^.

Code: Alles auswählen

public class String2{
        String s;
        
        public String2(String s){ this.s = s;}
        
        public int indexOf(String s2){

            if(s2.length() > s.length()) return -1;
            
            for(int i = 0; i < s.length()-s2.length()+1; i++){
                
                if(s.charAt(i) == s2.charAt(0)){
                    
                    boolean fits = true;
                    for(int j = 0; j < s2.length(); j++){
                        
                        fits &= (s2.charAt(j) == s.charAt(i+j));
                        
                    }
                    if(fits) return i;
                }
            }
            
            return -1;       
        }
}
Grüße, Johannes
FC SEEMOO No.1

DasKlavier
Neuling
Neuling
Beiträge: 3
Registriert: 2. Aug 2012 15:30

Re: Übung 10 - Fleißaufgabe String im String suchen

Beitrag von DasKlavier » 7. Aug 2012 21:47

Ja wollte es irgendwie zum Laufen bringen sehe gerade ,dass bei dem Code der eine return-Wert falsch ist naja egal habe mir deinen Code angeschaut und verstanden was du gemacht hast aber die Idee mit der Differenz hatte ich net. Mir kam als erstes die Idee es alles einzeln zu machen. Bzw. wenn ich zB den String s : ACDBAB und s2 : AB habe dann muss ich ja erst den ersten von s2 mit s vergleichen -> wäre dann ein true ,dann muss ich ihm sagen dass jetzt der zweite jeweils bei beiden genommen werden muss. In diesem Fall ja false , dann müsste ich wieder von neuem beginnen A solange durchlaufen zu lassen bis es beim nächsten Treffer ist. Die Position speicher ich dann vorher ab ,damit er nich wieder von ganz vorne beginnt. Also die Position vom ersten Treffer + 1 verschoben , wo er beim nächsten mal beginnen soll. Das war meine Idee dabei.

Antworten

Zurück zu „Archiv“