【问题标题】:java.lang.StringIndexOutOfBoundsException:edit distance between two strings is onejava.lang.StringIndexOutOfBoundsException:编辑两个字符串之间的距离为一
【发布时间】:2015-12-14 04:38:45
【问题描述】:

我正在尝试检查两个字符串之间的编辑距离是否为 1

两个字符串之间的编辑是以下更改之一。

添加一个字符 删除一个字符 换个角色

我正面临“StringIndexOutOfBoundsException”。

我是否需要检查任何内容以防止我的代码中出现此异常?

public class OneDiff { 
public OneDiff(String s,String s2){
int count=0;    
for (int i=0;i<(s.length()+s2.length());i++){
    if(s.charAt(i)!= s2.charAt(i)){
        count++;
            }
}
if(count==1){
    System.out.println("one difference");
}
}
public static void main(String args[]){
String s= "xxx";
String s1="xxxy";
OneDiff od=new OneDiff(s,s1);
}
}

【问题讨论】:

  • 哪个语句抛出异常?输入字符串是什么?请访问help center 并阅读How to Ask
  • int length = 0; for (int i = 0; i &lt; length - 1; i++) { 长度为 0 你在 for 循环中使用 length-1
  • 给定length = 0,for循环不会运行。
  • 很惊讶,您的代码是如何以及为什么会被执行的。由于长度初始化为零,您的 for 循环和 if 语句将不会执行

标签: java string exception indexoutofboundsexception


【解决方案1】:

正如@Ramanlfc 和@YoungHobbit 解释的那样,因为你的长度是0,所以它会抛出StringIndexOutOfBoundsException

但是对于你计算字符串的距离,你的算法是错误的,你需要实现Levenshtein distance来计算字符串的编辑距离。

【讨论】:

    【解决方案2】:
    for (int i=0;i<(s.length()+s2.length());i++){
    

    (s.length()+s2.length()) 将带您超出任一字符串的长度并给出StringIndexOutOfBoundsException

    【讨论】:

      【解决方案3】:

      是的,为防止出现异常,您需要确保i 不大于Strings 的任何长度。您可以通过将循环设置为只有与最小String 的长度一样多的迭代来做到这一点。

      这是一个例子:

      for (int i=0;i<Math.min(s.length(),s2.length());i++){
          if(s.charAt(i)!= s2.charAt(i)){
              count++;
          }
      }
      

      要考虑长度差异,您可以这样做:

      count += Math.abs(s.length() - s2.length());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        • 2018-08-23
        • 2017-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-07
        相关资源
        最近更新 更多