web-dev-qa-db-ja.com

Java負のindexOf(最後から数えて[length()])

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()     

ありがとう!

22
Whimusical

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)

... Javaはint0int-0(どちらも0として表されます)。検索文字列が見つからない場合、String.indexOfは通常-1を返すためです。ただし、いくつか注意点があります:

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

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

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
    }
}
28
rob

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

String s = "abcd";
int rindex = s.lastIndexof('d');
System.out.println(rindex); // print 0
4
The Tran

あなたは簡単に文字列を逆にすることができます:

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
0
alain.janinm