在java

时间:2017-06-22 16:36:26

标签: java string

这是我为查找字符串中的最小单词而编写的代码,但每当我尝试在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);

    }

}

6 个答案:

答案 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)

您使用的变量isigned 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;的输入运行代码时,minidxwhile循环之前为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=',')