24

Java で、他の言語と同様に、末尾から始まり、参照として length() を持つ char の indexOf を見つける方法はありますか?

   new String("abcd").reverseIndexOf("d"(,[4 or -0]))
or new String("abcd").indexOf("d",-0) // Should return a (-)1

...明白な代わりに

   new String("abcd").indexOf("d") - newString("abcd").length()     

ありがとう!

4

3 に答える 3

30

lastIndexOf(int ch)最後から開始して逆方向に検索し、最後に発生した絶対インデックスを返します。次に、文字列の長さからその数値を減算して、それが本当に必要な場合は否定することができます。

lastIndexOf(int ch, int fromIndex)特定のインデックスから逆方向に検索する場合にも使用できます。

負の数を渡したときに何が起こるかについての質問に答えるために、Stringクラスのソースコードを掘り下げることができます。結局のところ、最終的に呼び出される実装は、負の値をゼロにindexOfリセットします。fromIndex

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;
    }
    ...

2番目の例に戻ります。

"abcd".indexOf("d",-0)

...負のインデックスを受け入れて適切な負のインデックス(存在する場合)を返す汎用indexOfの実装は、Javaがと(両方とも0として表される)を区別せず、String.indexOfが通常は返すため、より複雑int 0ですint -0。 -検索文字列が見つからない場合は-1。しかし、あなたはあなたが望むものに近づくことができます。いくつかの注意点があることに注意してください。

  1. String.indexOf通常-1、検索文字列が見つからない場合に戻ります。ただし、-1は新しい実装では有効なインデックスであるため、新しいコントラクトを定義する必要があります。 Integer.MIN_VALUE検索文字列が見つからない場合に返されるようになりました。
  2. をテストできないためint -0、最後の文字のインデックスを。として参照することはできません-0。そのため、-1最後の文字のインデックスを参照し、そこから逆方向にカウントし続けます。
  3. -1項目2との一貫性を保つために、負の戻り値も最後の文字のインデックスとしてカウントダウンを開始します。

コードは単純化することもできますが、デバッガーで簡単にステップ実行できるように、意図的に冗長にしています。

package com.example.string;

public class StringExample {

    public static int indexOf(String str, String search, int fromIndex) {
        if (fromIndex < 0) {
            fromIndex = str.length() + fromIndex; // convert the negative index to a positive index, treating the negative index -1 as the index of the last character
            int index = str.lastIndexOf(search, fromIndex);
            if (index == -1) {
                index = Integer.MIN_VALUE; // String.indexOf normally returns -1 if the character is not found, but we need to define a new contract since -1 is a valid index for our new implementation
            }
            else {
                index = -(str.length() - index); // convert the result to a negative index--again, -1 is the index of the last character 
            }
            return index;
        }
        else {
            return str.indexOf(str, fromIndex);
        }
    }

    public static void main(String[] args) {
        System.out.println(indexOf("abcd", "d", -1)); // returns -1
        System.out.println(indexOf("adbcd", "d", -2)); // returns -4
    }
}
于 2012-05-18T21:49:34.290 に答える
4

メソッドを使用するだけString.lastIndexOf()です:

String s = "abcd";
int rindex = s.lastIndexof('d');
System.out.println(rindex); // print 0
于 2012-05-18T15:41:13.107 に答える
1

ちなみに、文字列を簡単に逆にすることができます:

String s="abcd";
StringBuilder reverseS = new StringBuilder(s).reverse();
System.out.println(reverseS.indexOf("d")); //print 0
System.out.println(reverseS.indexOf("a")); //print 3
System.out.println(reverseS.indexOf("d",1)); //print -1
于 2012-05-18T16:08:26.780 に答える