我正在尝试编写一个代码,该代码返回一个Array,其元素是我在字符串中查找的单词(出现)的索引: EX) d 输入:
String sent = "Hi is Hi is Hi is";
String find = "Hi";
ArrayList<Integer> index = indexFinder(sent,find);
For(int i=0;i<index.size(),i++)
System.out.println(index.get(i));
输出:
0
6
12
如果Java有像python这样的字符串切片函数,那将是非常好的。但是因为它没有...我试图使用substring()方法。
import java.util.ArrayList;
public class recursionEx {
ArrayList<Integer> index = new ArrayList<Integer>();
ArrayList<Integer> indexFinder(String sent, String find){
int pos =0;
int subPos =0;
if(sent.contains(find)==false){
return index;
}
else if(sent.contains(find)){
pos = sent.indexOf(find);
index.add(pos);
subPos = pos+find.length();
return indexFinder(sent.substring(subPos),find);
}
return index;
}
public static void main(String[] args) {
String sent = "Hi is Hi is Hi is";
String find = "Hi";
recursionEx r = new recursionEx();
ArrayList<Integer> g = r.indexFinder(sent, find);
for(int i=0;i<g.size();i++){
System.out.println(g.get(i));
}
}
}
输出
0
4
4
事后看来,我得到每次迭代发送的原始String的子字符串,因此索引数组中的元素是字符串发送子字符串中字符串查找的索引>这是0,4,4。
如何解决此问题以获得所需的输出? 任何帮助表示赞赏!
答案 0 :(得分:1)
您不应将子字符串用作参数,而应仅使用字符串中搜索的开头。这是一种有效的方法,它并不完美,试着让它变得更好:
import java.util.ArrayList;
public class recursionEx {
ArrayList<Integer> index = new ArrayList<Integer>();
String string;
recursionEx(String string){this.string = string;}
ArrayList<Integer> indexFinder(int position, String find){
int pos =0;
int subPos =0;
if(string.substring(position).contains(find)==false){
return index;
}
else if(string.substring(position).contains(find)){
pos = string.substring(position).indexOf(find) + position;
index.add(pos);
subPos = pos+find.length();
return indexFinder(subPos,find);
}
return index;
}
public static void main(String[] args) {
String sent = "Hi is Hi is Hi is";
String find = "Hi";
recursionEx r = new recursionEx(sent);
ArrayList<Integer> g = r.indexFinder(0, find);
for (Integer pos : g)
System.out.println(pos);
}
}
答案 1 :(得分:0)
将前一个子字符串的长度添加到每个后续输出,然后您将获得正确的数字。您可以通过旧指数计算这些长度。
答案 2 :(得分:0)
您不必使用递归来查找子字符串的索引,而是使用indexOf(searchstring, offset)
,直到找不到搜索字符串为止。
或者使用正则表达式,即Pattern
和Matcher
并收集group(0)
索引。
修改强>:
由于您想使用recursion,您可以将循环更改为递归调用。在这种情况下,您也可以将偏移量传递给递归调用,并继续使用indexOff(find, offset)
。
如果你想使用substring()
进行操作,你还必须跟踪原始字符串中子字符串的位置,并将其添加到indexOf(find)
的结果中,否则你会得到相对的索引仅限子字符串。