1

你能帮我吗?Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1运行此程序时出现错误。如何修复 rhi?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()));
                    }
                }
            }
        }
    }
4

1 回答 1

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”开头的单词和一个字符的单词(比如 I、a )。并用留下的词创建字符串

考虑另一种方式。与其从输出 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;
    }
  }
}
于 2013-04-09T16:25:58.233 回答