删除时索引超出范围

时间:2013-04-09 16:20:38

标签: java string compare

你能帮忙吗?运行此程序时获取错误Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1。如何解决这个问题? StringBuffer和StringTokenizer是必需的。另外,如何才能更简单?

import java.util.StringTokenizer;

public class main {
  public static int i, n;
  public static boolean orly = false;
  public static StringBuffer input, tokenStr;
  public static StringTokenizer out;
  public static char aChar;

  public static void main(String[] args) {
    input = new StringBuffer("some text");
    System.out.println("Начальная строка - " + input.toString());
    input = new StringBuffer(input.toString().replaceAll("[^a-z A-Z А-Я а-я]", ""));
    if (input.toString().trim().length() != 0) {
      out = new StringTokenizer(input.toString());
      System.out.println("Форматированая строка - " + input.toString());
      n = (out.countTokens());
      String[] charSet = { "a", "e", "o", "u", "y" };
      for (i = 0; i <= n - 1; i++) {
        tokenStr = new StringBuffer(out.nextToken());
        aChar = (tokenStr.charAt(0));
        String firstchar = tokenStr.toString().substring(0,1);
        if (tokenStr.length() > 1) {
          for (int i = 0; i <= charSet.length-1; i++) {
                if ((!firstchar.equals(charSet[i])) || (!firstchar.toUpperCase().equals(charSet[i]))) {
              input.delete(input.indexOf(tokenStr.toString()),input.indexOf(tokenStr.toString())+ tokenStr.length() + 1);
            }
         }
           } else {
                        input.deleteCharAt(input.indexOf(tokenStr.toString()));
                    }
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

for (i = 0; i <= n - 1; i++) {
  //stuff
  if (tokenStr.length() > 1) {
    for (int i = 0; i <= charSet.length-1; i++) {
        //stuff
    }
  }
}

在第一个for循环中,你有一个临时变量i,它只存在于那些花括号内。但是,在你的第二个for循环中,你正在创建另一个变量i。这将覆盖第一个,但仍会在两个循环中递增。你最好将第二个重命名为j或其他东西。

此外,在:

input.delete(input.indexOf(tokenStr.toString()),input.indexOf(tokenStr.toString())+ tokenStr.length() + 1);

如果tokenStr没有输入会怎么样?然后indexOf将返回-1(预定义行为),这将导致此特定异常。

  • 所以..我只需要删除字符串中不是从“a”,“e”,“o”,“u”,“y”,“i”和带有一个字符的单词开头的所有单词(如我,a)。并使用保留
  • 的单词创建String

考虑一种不同的方式。而不是从输出StringBuffer中删除不需要的单词,尝试在找到它们时将所需单词添加到输出缓冲区。您可以将此逻辑描述为沿着输入字符串行走并在找到它们时写下您想要的单词。

StringBuffer outString = new StringBuffer();
StringTokenizer st = new StringTokenizer(input.toString());
while(st.hasMoreTokens()){
  String currentToken = (String)st.nextToken();
  if(currentToken.length() < 2){
    continue;
  }
  for(int i = 0; i < charSet.length; i++){
    if(charSet[i] == currentToken.charAt(0)){
      outString.append(currentToken);
      break;
    }
  }
}