java - 删除时索引超出范围

标签 java string compare

你能帮忙吗?运行此程序时出现错误 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()));
                    }
                }
            }
        }
    }

最佳答案

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”开头的单词以及带有一个字符的单词(例如我,一)。并用保留的单词创建字符串

考虑一种不同的方式。不要从输出 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;
    }
  }
}

关于java - 删除时索引超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15907266/

相关文章:

c# - 如何将字符串放在字符的右侧?

matlab - 使用 MATLAB 比较文件

xml - Powershell-比较两个大型XML文件的部分

c++ - 如果数组全为 0(或 false),我可以在 C(++) 中检查吗?

java - p :poll calling growl twice

java - 将用户输入的数字转换为单词

c++ - 如何从 WCHAR 数组中获取子字符串

java - 在 JAI 中将图像分成四等份

java - 什么是NullPointerException,我该如何解决?

java - 使用 JavaFX 自动调整 TableView 中 TableColumn 的 TableColumn 大小 -8