JAVA Logik von Systembefehlen

Schnabulator1337

Freizeitschrauber(in)
Hallo,
für die Schule brauche ich ein Programm, welches in einem String einen Substring findet. Hierzu gibt es ja Systembefehle seitens Java, für folgenden Befehl frage ich, ob mir jemand dessen Code erklären kann, also wie man seine Funktion programmiert

" System.out.println(eingabeText.indexOf(suchText));"

Er soll mir sagen, wo im String sich der Substring befindet, ich komme auf kein sinnvolles Ergebnis, welches am Ende funktioniert ohne diese Systembefehle..

Danke schonmal und Liebe Grüße von mir :)
 
Ich gehe mal davon aus dass nicht der Print-Befehl sondern nur "indexOf()" gemeint ist. Das lässt sich per "händischem" Vergleich der einzelnen Character lösen.
 
Genau das meine ich, ja.
Könntest du mir evtl eine solche Funktion iwie schreiben? Das muss man ja iwie allgemein fassen können (Durch Schleifen oder so), da der Systembefehl ja auch bei jeder beliebigen Länge und so funktioniert. .

Liebe Grüße
 
Die "dümmste" Lösung (hab gerade keine Lust drüber nach zu denken ob es eleganter geht):
Du läufst mit einer Schleife vom Anfang durch den String und suchst erst einmal nach dem ersten gesuchten Buchstaben. Dessen Position merkst du dir. Dann schaust du ob die folgenden Buchstaben auch über einstimmen. Wenn ja bist du fertig ("break"), wenn nicht suchst du weiter nach dem Anfangsbuchstaben, vergleichst dann wieder den Rest, usw

Programmieren solltest du schon selbst, schließlich ist es ja der Sinn der Aufgabe dass du es lernst.
 
Etwa in dem Stil?

for(int i=0;i < Stringlaenge;i++){
if (String.charAt (i)==SuchString.charAt(0)){
merke=i;
for (int j=0;j <SuchStringlaenge;j++){
if (SuchString.charAt(j)==String.charAt(merke+1){}
else {break; }
}
}
}

Müsste eigentlich gehen, oder?^^
 
Du kannst da auch einfach eine "for each"-Schleife benutzen, ein String ist auch nur ein char-Array.
Ausserdem gibt es hier Code-Tags.
 
hätte das wie olstyle gelöst. zeichen für zeichen durchgehen, schauen ob das aktuelle zeichen dem ersten zeichen des suchtextes entspricht und wenn ja, die folgenden zeichen mit denen vom suchstring vergleichen usw usf...

bin jetzt zu faul zu schauen wies mit foreach geht, daher mal mit deiner variante versucht:
Code:
for(int i=0; i < Str.length(); i++) {
  if(Str.charAt(i) == SuchString.charAt(0)) {
    correct = true;
    for (int j=0; j < SuchString.length(); j++) {
      if(SuchString.charAt(j) != Str.charAt(i+j) {
        correct = false;
        break; 
      }
    }
    if(correct) return i;
  }
 }
return -1;
das ganz ist natürlich als funktion zu verstehen. du übergibst die beiden strings und zurück gibst du den index bzw -1 bei nem fehler/nicht gefunden. deine innerste if war sehr sinnfrei ^^ if(...) {} ähm ja. wozu? du wolltest einfach nur ne if bauen um im else-teil deinen break zu platzieren oder? da ist es doch wesentlich cleverer, den else-teil in den if-part zu holen und auf das else zu verzichten. einfach die bedingung negieren ^^ "wenn sie gleich sind, mache nichts, sonst break" heisst doch nichts andres wie "wenn sie NICHT gleich sind break". und das merke dingen ist überflüssig, du hast ja dein i. das wird innerhalb der inneren schleife ja nicht geändert, ist aber auslesbar. und merke (bzw i) +1... das vergleicht verschiedene suchstring-zeichen mit dem immer gleichen string-zeichen. das KANN so nich klappen ^^

prinzipiell sollte es so funktionieren (also rein vom algorythmus her, kA obs jetzt korrektes java war ^^), aber du solltest eventuell noch ein paar fehler-abfragen einbauen. zum bsp: gibts überhaupt ein suchwort? oder einen string in dem gescht werden soll (str.length() > 0)? und bei der inneren schleife: ist der hauptsring lang genug fürs zu suchende? also bspw abcd und suche cde. beim e kommt ne nullpointerexception oder sowas, weil es string.charat(4) nich gibt ^^
 
Der Index der inneren Schleife muss ausserdem bei 1 beginnen. Ansonsten sollte es gehen.
Vorher die Strings in Chararrays überführen könnte die Sache beschleunigen wenn das bei Java nicht eh das Selbe ist(bei C ist es das z.B.nicht).
 
Falls es dich interessiert, das ist was Java macht:


Code:
   /**
     * Returns the index within this string of the first occurrence of the
     * specified substring. The integer returned is the smallest value
     * <i>k</i> such that:
     * <blockquote><pre>
     * this.startsWith(str, <i>k</i>)
     * </pre></blockquote>
     * is <code>true</code>.
     *
     * @param   str   any string.
     * @return  if the string argument occurs as a substring within this
     *          object, then the index of the first character of the first
     *          such substring is returned; if it does not occur as a
     *          substring, <code>-1</code> is returned.
     */
    public int indexOf(String str) {
    return indexOf(str, 0);
    }

    /**
     * Returns the index within this string of the first occurrence of the
     * specified substring, starting at the specified index.  The integer
     * returned is the smallest value <tt>k</tt> for which:
     * <blockquote><pre>
     *     k >= Math.min(fromIndex, this.length()) && this.startsWith(str, k)
     * </pre></blockquote>
     * If no such value of <i>k</i> exists, then -1 is returned.
     *
     * @param   str         the substring for which to search.
     * @param   fromIndex   the index from which to start the search.
     * @return  the index within this string of the first occurrence of the
     *          specified substring, starting at the specified index.
     */
    public int indexOf(String str, int fromIndex) {
        return indexOf(value, offset, count,
                       str.value, str.offset, str.count, fromIndex);
    }

    /**
     * Code shared by String and StringBuffer to do searches. The
     * source is the character array being searched, and the target
     * is the string being searched for.
     *
     * @param   source       the characters being searched.
     * @param   sourceOffset offset of the source string.
     * @param   sourceCount  count of the source string.
     * @param   target       the characters being searched for.
     * @param   targetOffset offset of the target string.
     * @param   targetCount  count of the target string.
     * @param   fromIndex    the index to begin searching from.
     */
    static int indexOf(char[] source, int sourceOffset, int sourceCount,
                       char[] target, int targetOffset, int targetCount,
                       int fromIndex) {
    if (fromIndex >= sourceCount) {
            return (targetCount == 0 ? sourceCount : -1);
    }
        if (fromIndex < 0) {
            fromIndex = 0;
        }
    if (targetCount == 0) {
        return fromIndex;
    }

        char first  = target[targetOffset];
        int max = sourceOffset + (sourceCount - targetCount);

        for (int i = sourceOffset + fromIndex; i <= max; i++) {
            /* Look for first character. */
            if (source[i] != first) {
                while (++i <= max && source[i] != first);
            }

            /* Found first character, now look at the rest of v2 */
            if (i <= max) {
                int j = i + 1;
                int end = j + targetCount - 1;
                for (int k = targetOffset + 1; j < end && source[j] ==
                         target[k]; j++, k++);

                if (j == end) {
                    /* Found whole string. */
                    return i - sourceOffset;
                }
            }
        }
        return -1;
    }

Alternativ könnte man auch noch KMP verwenden: Knuth-Morris-Pratt-Algorithmus Wikipedia
 
KMP ist aber vermutlich ein bisschen zuviel des Guten, sofern es nicht Performance relevant ist ^^
 
Zurück