字符串中所有出现的字符的索引

Tru*_*ufa 88 java indexing loops character

以下代码将打印2

String word = "bannanas";
String guess = "n";
int index;
System.out.println( 
    index = word.indexOf(guess)
);
Run Code Online (Sandbox Code Playgroud)

我想知道如何在字符串"bannanas"中获取"n"("guess")的所有索引

预期结果将是: [2,3,5]

Ted*_*opp 142

这应该打印出位置列表,而-1不是Peter Lawrey解决方案的 最终结果.

int index = word.indexOf(guess);
while (index >= 0) {
    System.out.println(index);
    index = word.indexOf(guess, index + 1);
}
Run Code Online (Sandbox Code Playgroud)

它也可以作为for循环完成:

for (int index = word.indexOf(guess);
     index >= 0;
     index = word.indexOf(guess, index + 1))
{
    System.out.println(index);
}
Run Code Online (Sandbox Code Playgroud)

[注意:如果guess可以比单个字符长,那么通过分析guess字符串,可以word比上面的循环更快地循环.这种方法的基准是Boyer-Moore算法.但是,似乎不存在有利于使用这种方法的条件.


Pet*_*rey 22

尝试以下(现在不打印-1!)

int index = word.indexOf(guess);
while(index >= 0) {
   System.out.println(index);
   index = word.indexOf(guess, index+1);
}
Run Code Online (Sandbox Code Playgroud)


Nam*_*man 7

使用 Java9,可以使用iterate(int seed, IntPredicate hasNext,IntUnaryOperator next)以下功能:-

List<Integer> indexes = IntStream
          .iterate(word.indexOf(c), index -> index >= 0, index -> word.indexOf(c, index + 1))
          .boxed()
          .collect(Collectors.toList());
System.out.printlnt(indexes);
Run Code Online (Sandbox Code Playgroud)


POS*_*DER 6

String string = "bannanas";
ArrayList<Integer> list = new ArrayList<Integer>();
char character = 'n';
for(int i = 0; i < string.length(); i++){
    if(string.charAt(i) == character){
       list.add(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果将如下使用:

    for(Integer i : list){
        System.out.println(i);
    }
Run Code Online (Sandbox Code Playgroud)

或者作为一个数组:

list.toArray();
Run Code Online (Sandbox Code Playgroud)


Pav*_*ngh 6

这可以通过使用正则表达式的 Java 9 以函数方式完成:

Pattern.compile(Pattern.quote(guess)) // sanitize input and create pattern
            .matcher(word) // create matcher
            .results()     // get the MatchResults, Java 9 method
            .map(MatchResult::start) // get the first index
            .collect(Collectors.toList()) // collect found indices into a list
    );
Run Code Online (Sandbox Code Playgroud)

这是CharSequence使用扩展方法将此逻辑作为新方法添加到API 中的 Kotlin 解决方案:

 // Extension method
fun CharSequence.indicesOf(input: String): List<Int> =
    Regex(Pattern.quote(input)) // build regex
        .findAll(this)          // get the matches
        .map { it.range.first } // get the index
        .toCollection(mutableListOf()) // collect the result as list

// call the methods as
"Banana".indicesOf("a") // [1, 3, 5]
Run Code Online (Sandbox Code Playgroud)


urS*_*Sus 5

int index = -1;
while((index = text.indexOf("on", index + 1)) >= 0) {
   LOG.d("index=" + index);
}
Run Code Online (Sandbox Code Playgroud)