【问题标题】:Recursively finding indices of a string递归查找字符串的索引
【发布时间】:2016-05-20 14:55:59
【问题描述】:

我正在尝试编写一个代码,该代码返回一个数组,其元素是我在字符串中查找的单词(出现)的索引: 前任) 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

事后看来,我每次迭代都会发送原始字符串的子字符串,因此索引数组中的元素是 发送的字符串的子字符串中的 字符串查找的索引> 分别是 0、4、4。

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

【问题讨论】:

  • 附注:您可以直接调用indexOf() 并检查返回值是否小于0,在这种情况下找不到搜索字符串,而不是调用sent.contains(find)
  • 是的,我将 if 语句更改为 if(sent.indexOf(find)==-1)。谢谢
  • 我感觉你误解了我:不要只用indexOf() == -1 替换contains(),而是只调用indexOf()一次 并检查索引。我的意思是(伪代码)index = indexOf(whatever); if( index &gt;= 0 ) { add( index); }.

标签: java string recursion slice


【解决方案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) 始终将整个字符串和要分析的子字符串的开始位置作为参数传递。 (2)传递子串进行分析和子串开始的位置。在所有情况下,您都需要 3 个参数:您搜索的内容、搜索的内容和位置。
  • 哎呀,我不小心删除了我的评论。感谢您提供此解决方案。
【解决方案2】:

将前一个子字符串的长度添加到后面的每个输出中,然后得到正确的数字。您可以通过旧索引计算这些长度。

【讨论】:

  • 感谢您的建议。我认为这与 A. Ocannaille 的建议是一致的。
【解决方案3】:

您不必使用递归来查找子字符串的索引,而是使用indexOf(searchstring, offset) 直到您不再找到搜索字符串。

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

编辑

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

如果您想使用substring() 来执行此操作,您还必须跟踪子字符串在原始字符串中的位置并将其添加到indexOf(find) 的结果中,否则您只会获得相对于子字符串的索引.

【讨论】:

  • 感谢您的建议!但我只是为了练习目的而尝试使用递归:D
  • @LookAtTheBigPicture 我明白了,但是您仍然可以将它与递归一起使用。除非您再次添加子字符串的索引,否则获取子字符串会更改索引。
  • 是的,我认为我的代码就是这样。我应该只将索引添加到 pos(int 变量)吗?
猜你喜欢
  • 1970-01-01
  • 2012-09-19
  • 2016-10-02
  • 2014-02-19
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多