递归地查找字符串的索引

时间:2016-02-10 10:05:39

标签: java string recursion slice

我正在尝试编写一个代码,该代码返回一个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。

如何解决此问题以获得所需的输出? 任何帮助表示赞赏!

3 个答案:

答案 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),直到找不到搜索字符串为止。

或者使用正则表达式,即PatternMatcher并收集group(0)索引。

修改

由于您想使用recursion,您可以将循环更改为递归调用。在这种情况下,您也可以将偏移量传递给递归调用,并继续使用indexOff(find, offset)

如果你想使用substring()进行操作,你还必须跟踪原始字符串中子字符串的位置,并将其添加到indexOf(find)的结果中,否则你会得到相对的索引仅限子字符串。