3

これが methodlastIndexOfにあるもので、chは一致する文字、strはソース文字列です。

public static int lastIndexOf(char ch, String str) {
    // check for null string or empty string
    if (str.length() == 0 || str == null) {
        return -1;
    }

    int indexInRest = lastIndexOf(ch, str.substring(1));
    char first = str.charAt(0);

    // recursive call to find the last matching character
    if (first == ch) {
        return 1 + indexInRest; // this might not work properly
    } else
        return indexInRest;
}

私のクラスのメインメソッドで私が呼び出す場合:

    System.out.println(lastIndexOf('r', "recurse"));
    System.out.println(lastIndexOf('p', "recurse"));

私は得た:

1
-1

望ましい結果は次のとおりです。

4
-1

提案してください。

4

6 に答える 6

3

String.lastIndexOf() が API に存在するため、このメソッドを記述しても意味がなく、再帰を使用してこれを行うと遅くなり、多くのメモリを使用するため、これは宿題に違いありません。

ここでヒント。現在、アルゴリズムは先頭から文字を切り刻み ( substring(1) )、それらを比較しています。lastIndexOf() は、最初に文字列の後ろにある文字を削除して一致を探し、一致が見つかったら終了する必要があります。

于 2012-09-27T15:08:24.707 に答える
3

機能的なアプローチを取るのはどうですか..

public static int lastIndexOf(char ch, String str) {
    if (str.charAt(str.length() - 1) == ch) { return str.length() -1; }
    if (str.length() <= 1) { return -1; }
    return lastIndexOf(ch, str.substring(0, str.length() - 1));
}
于 2012-09-27T15:09:33.647 に答える
0

String#lastIndexOf(int ch)実装を一般的なガイドラインとして使用し、

public int lastIndexOf(int ch) {
    return lastIndexOf(ch, value.length - 1);
}

public int lastIndexOf(int ch, int fromIndex) {
    if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
        // handle most cases here (ch is a BMP code point or a
        // negative value (invalid code point))
        final char[] value = this.value;
        int i = Math.min(fromIndex, value.length - 1);
        for (; i >= 0; i--) {
            if (value[i] == ch) {
                return i;
            }
        }
        return -1;
    } else {
        return lastIndexOfSupplementary(ch, fromIndex);
    }
}

private int lastIndexOfSupplementary(int ch, int fromIndex) {
    if (Character.isValidCodePoint(ch)) {
        final char[] value = this.value;
        char hi = Character.highSurrogate(ch);
        char lo = Character.lowSurrogate(ch);
        int i = Math.min(fromIndex, value.length - 2);
        for (; i >= 0; i--) {
            if (value[i] == hi && value[i + 1] == lo) {
                return i;
            }
        }
    }
    return -1;
}

この、

lastIndexOf(ch, value.length - 1);

value文字配列としてのターゲット文字列です。

于 2012-09-27T15:07:40.497 に答える
0

まず、次のように変更する必要があります。

if (str == null || str.length() == 0) {

NPEは次の場合にレイズする可能性があるstrためnull

次のように、コードにパラメーターを追加deepします。

public static int lastIndexOf(char ch, String str, int deep) {

そして、再帰呼び出しごとにその値を増やします

int indexInRest = lastIndexOf(ch, str.substring(1), deep++);

次に、戻り文で、戻り値に deep を追加します。

return 1 + indexInRest + deep; // this might not work properly

で関数を初めて呼び出すdeep = 0か、さらに良いことに、2 つのパラメーターのメソッドで、パラメーターを 0 に設定してlastIndexOfの 3 つのパラメーターのバージョンを呼び出します。lastIndexOfdeep

于 2012-09-27T15:08:22.163 に答える
0

Matcher宿題で求められる文字列分析の進化を予測するためにも使用できます。

public int getlastMatch(String searchPattern,String textString) {
       int index = -1;
       Pattern pattern = Pattern.compile(searchPattern);
       Matcher matcher = pattern.matcher(textString);

       while(matcher.find()) {
               index = matcher.start();
       }
       return index;
   }

textStringあなたの気になるキャラクターはどこにいるでしょうか。

したがって、文字列内の文字列の一部の最後の出現を返します。

于 2012-09-27T15:09:07.717 に答える
0

なぜString.lastIndexOfこのように使用しないのですか:

str.lastIndexOf(ch)
于 2012-09-27T15:06:53.617 に答える