这是我为查找字符串中的最小单词而编写的代码,但每当我尝试在eclipse中运行它时,它会在嵌套的while语句中显示一个(字符串索引超出范围-2147483648)错误,我有标记,我不明白它的原因,因为我的程序似乎在范围内运行良好,即小于输入字符串的长度。
提前致谢!!
import java.util.Scanner;
public class Minword {
public static String minLengthWord(String input){
// Write your code here
int count[]=new int[50],i,j=0,len=input.length();
String output = "";
for(i=0;i<len;i++)
{
if(input.charAt(i)!=' ')
{
count[j]++;
}
else
j++;
}
int minidx=0;
for(i=1;i<j;i++)
{
if(count[minidx]>count[i])
minidx=i;
}
int words=0;
i=0;
while(words<=minidx)
{
if(words==minidx)
{
***while(i<len && input.charAt(i)!=' ')***
{
output+=input.charAt(i);
i++;
}
}
else if(i<len && input.charAt(i)==' ')
words++;
i++;
}
return output;
}
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
String input,output;
input=s.nextLine();
output=minLengthWord(input);
}
}
答案 0 :(得分:1)
我的代码存在问题,但为了获得最短的字长,您可以使用Stream和min()
。你的minLengthWord方法可能是:
String f = "haha hah ha jajaja";
OptionalInt shortest = Arrays.stream(f.split(" ")).mapToInt(String::length).min();
System.out.println(shortest.getAsInt());
答案 1 :(得分:0)
您使用的变量i
是signed int
,因此范围从-2147483648到2147483647。
以下案例显示了您的问题:
i = 2147483647;
i++;
增量后,由于int溢出,i
的值将为-2147483648。请检查此question。
看起来你得到了巨大的投入,因此造成了这个问题。
答案 2 :(得分:0)
嗯,-2147483648是最大整数+1。你有一个环绕。变量我变得如此之大,以至于它再次从负面开始。
如果要处理大于2 GB的文本,则必须使用long。
答案 3 :(得分:0)
while(words<=minidx)
{
if(words==minidx)
{
***while(i<len && input.charAt(i)!=' ')***
{
output+=input.charAt(i);
i++;
}
}
else if(i<len && input.charAt(i)==' ')
words++;
i++;
}
你的问题是当你的单词和minidx都是0时,你的外部while循环总是为真而且单词总是等于minidx,并且我一直在增加直到达到它的最大数量。
您需要在内部循环后添加break
,其次,您需要将i<j
更改为i<=j
以下是更正后的代码:
int minidx = 0;
for (i = 1; i <= j; i++) { //-------------------------> change i<j to i<=j
if (count[minidx] > count[i])
minidx = i;
}
int words = 0;
i = 0;
System.out.println(minidx);
while (words <= minidx) {
if (words == minidx) {
while (i < len && input.charAt(i) != ' ') {
output += input.charAt(i);
i++;
}
break; //-------------------------> add break statement here.
} else if (i < len && input.charAt(i) == ' ') {
words++;
}
i++;
}
答案 4 :(得分:0)
当我尝试使用&#34; Hello World&#34;的输入运行代码时,minidx
在while
循环之前为0。 words
也为0,因此words<=minidx
为真,并输入循环。 words==minidx
为真(它们都为0),因此输入if
语句。因为它永远不会进入else if
(这是words
唯一被更改的地方),所以words
始终为0.因此循环变为无限循环。与此同时,i
只是不断增长,直到它溢出并变为负面。
答案 5 :(得分:0)
这是一个使用Java 8的Stream API的版本: 从minLengthWord方法中删除所有代码并粘贴下面的代码,它将起作用并解决运行时问题
my_data = genfromtxt('file.csv', delimiter=',')