0

听起来很简单,但对我来说这很奇怪。我正在尝试导入一个数据文件(我已经成功完成),并使用它并比较每个单词以查看哪个单词最长。到目前为止,它不起作用(索引超出范围),当我确实操纵它(错误地)工作时,它给了我一个错误的单词作为最长的单词。

这是我目前所拥有的......

主文件:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Collections;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import static java.lang.System.*;

public class FancyWordsRunner

{
    private static int max = 0;
    public static void main( String args[] ) throws IOException
    {
        ArrayList<String> wordList = new ArrayList<String>();
            {

                String ray = "";
                    Scanner welcome = new Scanner(new File("fancywords.dat"));
                    while(welcome.hasNext())
                    {
                        ray = welcome.next();
                        wordList.add(ray);

                        for(int i = 0; i<wordList.size(); i++)
                         {
                            int j = i+1;
                                if(wordList.get(j).length()>wordList.get(i).length())
                                max = j;
                        }
                    }

                    }
                    String maximum = wordList.get(max);
                    out.println(maximum);
        }       
}

花式字.dat:

2013 UIL STATE CONTEST
PROGRAMMING IS FUN
TODAY IS SATURDAY

电流输出:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at FancyWordsRunner.main(FancyWordsRunner.java:35)
4

4 回答 4

0
for(int i = 0; i<wordList.size(); i++)
    {
        int j = i+1;

您正在设置for循环以确保i永远不会超出范围,但随后您设置j为大于 1 i,因此在循环的最后一次运行中,当i位于最后一个索引时,j比最后一个索引大一个(并且超出范围)。

尝试这个:

for(int i=0; i<(wordList.size()-1); ++i)

逻辑错误的解决方法:

for(int i = 0; i<wordList.size();++i) {
    if(wordList.get(i).length() >= wordList.get(max).length()) {
        max = i;
   }
}

(这也消除了j最初导致的原因IndexOutOfBoundsException。)


正如其他人指出的那样,您的程序中有一些冗余。将您的循环更改for为我的建议将解决您的逻辑问题并使您的程序输出正确的结果。其他答案都去掉了ArrayList,这不是完全必要的,但是如果你想简化你的解决方案并保留ArrayList,你的while循环可能看起来像这样:

String longestWord = "";
Scanner welcome = new Scanner(new File("fancywords.dat"));
while(welcome.hasNext()) {
    ray = welcome.next();
    wordList.add(ray);

    if(ray.length() > longestWord.length()) {
        longestWord = ray;
    }

}

该解决方案简化了您的答案,在程序中节省了一些时间并保留了ArrayList(您仍然将每个单词都保存在内存中)。

您的for循环运行了很多次并多次检查每个单词。一旦我们知道这CONTEST是前四个单词中最长的,我们就不需要看是否PROGRAMMING比前三个长,只看它是否长于CONTEST,我们不需要与除,SATURDAY之外的任何单词进行比较PROGRAMMING它在阅读时被确定为最长的单词,并在那时和阅读之间继续是最长的单词SATURDAY等。如果我们只关心最长的单词,我们只需将每个单词与当前最长的单词进行比较。

而且因为你ArrayList还在记忆中,你可以重新创建你读过的原始单词,找到最短的单词,找到平均单词长度等等,无论你想用它做什么。

于 2013-11-08T04:10:52.023 回答
0

在您的第一次迭代中,您只向列表中添加了一个项目,因此大小为 1 意味着仅索引为 0;

int j = i+1;
if(wordList.get(j)

这是试图访问索引 1

走过:

1)
 ArrayList<String> wordList = new ArrayList<String>();
 // wordlist.size() = 0;  available indices - none

2)
 wordList.add(ray);
 // wordlist.size() = 1; available indices - 0

3)
 int j = i+1;   // i = 0; j = 1
 if(wordList.get(j)  // access index j
 // oops!; There is no index j

这会导致IndexOutOfBoundsException.

编辑:替代 - 你真的不需要一个列表来执行这个任务

String maxWord = "";
String current = "";

while(welcome.hasNext()){
    current = welcome.next();

    if (current.length() > maxWord.length()){
        maxWord = current;
    }
}

System.out.println(maxWord);
于 2013-11-08T04:11:09.023 回答
0

while用这样的东西替换你的循环怎么样。

String longestSoFar = "";
while (welcome.hasNext()) {
    String current = welcome.next();
    if (current.length() > longestSoFar.length()) {
        longestSoFar = current;
    }
}
于 2013-11-08T04:15:08.827 回答
0

我意识到您的错误已被其他答案识别,但是,您确实意识到可以以更简单的方式解决此问题?

public static void main( String args[] ) throws IOException {
    String max = "";
    Scanner welcome = new Scanner(new File("fancywords.dat"));
    while(welcome.hasNext()) {
        String ray = welcome.next();
        if (ray.length() > max.length()) {
            max = ray;
        }
    }       
    System.out.println(max);
}
于 2013-11-08T04:16:18.277 回答