听起来很简单,但对我来说这很奇怪。我正在尝试导入一个数据文件(我已成功完成),并使用它并比较每个单词以查看哪个是最长的。到目前为止,它不起作用(索引越界),当我操作它(错误地)时,它给了我错误的单词作为最长的单词。
这就是我到目前为止......
主档案:
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);
}
}
fancywords.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)
答案 0 :(得分:0)
for(int i = 0; i<wordList.size(); i++)
{
int j = i+1;
您正在设置for
循环,以确保i
永远不会超出范围,但是您将j
设置为等于大于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
的{{1}}。)
正如其他人所指出的那样,你的程序中存在一些冗余。将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
被确定为读取时最长的单词,并且仍然是当时和阅读之间最长的单词{{1}如果我们关心的是最长的单词,我们只需要将每个单词与当前最长的单词进行比较。
因为你的SATURDAY
仍在记忆中,你可以重新创建你读到的原始单词,找到最短的单词,找到平均单词长度等,无论你想用它做什么。
答案 1 :(得分: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);
答案 2 :(得分:0)
如何用这样的东西替换你的while
循环。
String longestSoFar = "";
while (welcome.hasNext()) {
String current = welcome.next();
if (current.length() > longestSoFar.length()) {
longestSoFar = current;
}
}
答案 3 :(得分: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);
}