26

我对 indexOf 方法有疑问。我想在一个字符串中找到多个“X”的情况。

假设我的字符串是“x is x is x is x”,我想在它的所有索引位置找到 x。但是,您如何针对多种情况执行此操作?这甚至可以用 indexOf 吗?

我做了 int temp = str.indexOf('x'); 它找到第一个 x。我试图做一个 for 循环,其中 i 被初始化为字符串的长度,但这不起作用,因为我一遍又一遍地找到第一个 x。

for (int y = temp1; y >= 0;y-- ) 
{
    int temp = str.indexOf('x');
    System.out.println(temp);
}

但这不起作用。我应该使用正则表达式吗?因为我真的不知道如何使用正则表达式方法。

任何帮助将不胜感激,谢谢!

4

5 回答 5

51

该方法还有第二个变体indexOf,它将起始索引作为参数。

i = str.indexOf('x');
while(i >= 0) {
     System.out.println(i);
     i = str.indexOf('x', i+1);
}
于 2011-02-14T01:11:31.707 回答
11

还有另一个版本的indexOf方法,fromIndex作为参数。
因此,您可以在循环中调用它,每次都prevPosition + 1作为第二个参数传递。

文档: http:
//download.oracle.com/javase/6/docs/api/java/lang/String.html#indexOf(int, int)

于 2011-02-14T01:08:24.210 回答
5

您可以使用indexOf指定起始索引。因此,在您的循环中,您存储“x”的最后一个位置,然后使用该索引 + 1 再次搜索。

于 2011-02-14T01:09:31.110 回答
3

这是 Streams API 的解决方案:

String text = "Lets search for E ?";

final char key = "e".charAt(0);
int[] indices = IntStream.range(0, text.length())
    .filter(i -> text.charAt(i) == key)
    .toArray();

输出将是这样的:

//1
//6

如果要在结果中添加大写字母,则需要更改filter' 参数闭包:

.filter(i -> Character.toLowerCase(text.charAt(i)) == key)

然后输出将是这样的:

//1
//6
//16

此外,如果您只想使用结果或将其打印出来以进行快速测试,您可以使用forEach终端操作来完成:

IntStream.range(0, text.length())
    .filter(i -> text.charAt(i) == key)
    .forEach(System.out::println);
于 2016-06-11T13:44:57.990 回答
0
String name = "alameer kaiser aziz";
String found = "a";
int num = name.indexOf(found);
while (num >=0) {
    System.out.println(num);
    num = name.indexOf(found,num+1);
}
于 2017-07-13T13:38:28.913 回答