字符串索引超出范围:-1错误循环

时间:2015-03-27 06:05:32

标签: java runtime-error indexoutofboundsexception

我使用此问题检查了旧主题,无法修复它。

此方法用于比较两个字符串,如果第一个字符串的每个字母/字符都在第二个字符串中找到(反之亦然),则该方法应返回“true”(即使第二个字符串有额外的信件)。

我的想法是检查第一个字符串的每个索引处的字母,看它是否在第二个字符串中,如果是,则在两个字符串中删除该字母。当第一个字符串用完字母(长度等于零)时,布尔值应返回true。

我认为我的循环或子串在某些时候超出了范围。

public boolean isFound(String first, String second) {
    StringBuilder sb1 = new StringBuilder(first);
    StringBuilder sb2 = new StringBuilder(second);

    first.toCharArray();
    second.toCharArray();
    for (int i = 0; i < first.length(); i++) {
        int k = (first.substring(i, i + 1)).indexOf(second, i);
        if (sb1.length() > 0) {
            sb1.deleteCharAt(k);
            sb2.deleteCharAt(k);
        }
    }
    if (sb1.length() == 0) {
        return true;
    } else {
        return false;
    }
}

Ex:“at”和“tack”应该返回true,“tree”和“ere”应该返回false。

修改 在审核了评论之后,我的新代码现在就是这个。即使使用“树”和“树”,它总是返回false。

   public boolean isFound(String first, String second){
   StringBuilder sb2 = new StringBuilder(second); 

   for(int i=0;i<first.length();i++){
   int k = sb2.indexOf(first,i);
   if (k==-1)
       return false;
   else sb2.deleteCharAt(k);
}
      return true;
}

3 个答案:

答案 0 :(得分:4)

您的代码中存在许多问题。

  • 您只需要一个StringBuilder版本,即second
  • 版本
  • toCharArray()的调用是多余的
  • 您不应在first中搜索second的每个字符,而应搜索其sb2的可变版本。
  • 您使用indexOf错误。应该在StringBuilder对象上调用此方法来搜索第一个参数,并将其交换。

您可以使用的伪代码是

isSuperAnagram(String first, String second) {
    sb = StringBuilder(second)
    for all chars in first {
        k = search index of current char of first in sb
        if(k == -1) // char is not in sb
            return false
        else
            remove char at index k from sb
    }
    return true
}

答案 1 :(得分:1)

请查看您的算法和API的代码/用法

` first.toCharArray();`

second.toCharArray();

不会将第一个,第二个转换为数组,此API将返回一个字符数组。

(first.substring(i,i+1)).indexOf(second,i);将在first.substring中搜索整个substring2。

检查算法/代码是否相应地更正。请注意所有边缘/角落情况。

理想的方法是使用hashmap。(在额外空间的成本上)

答案 2 :(得分:0)

您可以使用简单的逻辑将代码实现为

 for(int i=0;i<sb1.length;i++)
 {
  for(int j=0;j<sb2.length;j++)
   {
    if(sb1.[i]==sb2.[j])     
     { 
       count++;
       break;
     }
      if(count>=sb1.length)
      {
        System.out.print("match");
      }
   }

 }

如果您想要更多条件,请将其发布在我的帖子下面,我只为您的后续示例撰写     例如:“at”和“tack”应该返回true,“tree”和“ere”应该返回false。