gpt4 book ai didi

java - 删除时索引超出范围

转载 作者:行者123 更新时间:2023-12-01 04:45:40 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com