字符串:“I love Java I love Python I love Internet”
要求:找出字符串里所有的love及其出现位置
思路1: 首先,要得到字符串中某个元素的位置,通常使用String的indexOf方法,并且因为这个字符串中可能存在多个这样的元素(多次、重复的操作使用循环或者递归等方法)所以要利用循环操作。但是这个indexOf方法只能找到第一个匹配的元素位置,那如果这个字符串后面还有这个元素呢?,但我们要紧紧抓住这个方法的局限性,正因为它只能找到第一个匹配的元素位置,那只要后面我们每一次循环操作时,都让我们匹配的元素是第一个不就行了,所以每一次匹配到这个元素后,就将这个元素及其前面的部分删除即使用String的subString方法拆分,然后再寻找下一个的位置,直到找完
思路2: 直接利用split方法拆分得到所有的单词形成一个字符串数组,即将空格作为拆分条件,然后遍历这个数组,只要数组的元素和"love"相等就记录这个元素的位置(这个元素的位置就等于前面的字符串元素长度加上空格的个数再加1)
代码:
package net.dc.lesson20.exercise;
public class GetStrPosition {
public static void main(String[] args) {
String str = "I love Java I love Python I love Internet";
//第一种方法
int frontLength = 0;//定义该变量用于记录匹配"love"的元素前面的长度
while(str.contains("love")){//只要该str字符串中有匹配"love"的元素,才进行以下操作
int index = str.indexOf("love");//定义该变量用于记录匹配"love"的元素在当前字符串的位置
//匹配"love"的元素位置等于frontLength加上index;加1为了从1开始计数,更加直观:
System.out.println(String.format("str[%d] = love", index + frontLength + 1));
frontLength += (index + 4);
str = str.substring(index + 4);//将字符串中匹配"love"元素的前面部分及其本身截取,留下后面的部分
}
System.out.println();
//第二种方法
String str_2 = "I love Java I love Python I love Internet";
String[] strArr = str_2.split(" ");
for (int i = 0; i < strArr.length; i++) {
if(strArr[i].equals("love")){
int frontLength_2 = 0;//定义该变量用于记录匹配"love"的元素前面的长度
for(int j = 0; j < i; j++){
frontLength_2 += strArr[j].length();
}//该循环是为了加上前面数组元素的长度
frontLength_2 += i;//加上前面空格的个数
//加1是因为,在数组中匹配该"love"元素的位置,并不仅仅只是前面所有元素的长度加上空格个数,还得算上该元素本身出现的位置
System.out.println(String.format("str[%d] = love", frontLength_2 + 1));
}
}
}
}
结果: