该程序应该将字母表中的每个字母归为其在Scrable中的值,获取文本文件,处理单个单词,并打印具有最高值平均值的单词(平均值为所有单词的总值)字符,字母和非字母,除以这些字符的数量)。我的代码似乎几乎完整,但它报告了一个超出范围的错误,我不知道为什么。
这是错误:java.lang.ArrayIndexOutOfBoundsException: -52
这是类驱动程序:
import java.util.Scanner;
import java.io.*;
public class ScrabbleDriver{
public static void main(String[] args) throws IOException{
try{
Scanner scan = new Scanner(System.in);
System.out.println("Enter text file ");
String fileName = scan.next();
Scrabble s = new Scrabble(fileName);
s.readLines();
s.report();
}
catch(Exception e){
System.out.println(e);}
}
}
这是构造函数类:
import java.io.IOException;
import java.util.StringTokenizer;
public class Scrabble extends Echo {
private int [] scores = {1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10};
private double maxScore = 0;
private String maxScoreWord = " ";
public Scrabble(String fn) throws IOException {
super(fn);
}
public void processLine(String line) {
line = line.toLowerCase();
StringTokenizer s = new StringTokenizer(line);
while (s.hasMoreTokens()) {
processToken(s.nextToken());
}
}
public void processToken(String token) {
double wordScore = 0;
for (int n = 0 ; n < token.length() ; n++) {
char j = token.charAt(n);
if ((j == '!') || (j == ',') || (j == '.'))
wordScore = wordScore;
else {
int m = (int) (j - 'a');
if (m <= 25) {
wordScore = wordScore + scores[m];
}
}
}
wordScore = (wordScore / token.length());
if (wordScore > maxScore) {
maxScore = wordScore;
maxScoreWord = token;
}
}
public void report() {
System.out.print("Winner: " + maxScoreWord + " " + "Score: " + maxScore);
}
}
这是Echo类:
import java.util.Scanner;
import java.io.*;
public class Echo {
String fileName; // external file name
Scanner scan; // Scanner object for reading from external file
public Echo(String fn) throws IOException {
fileName = fn;
scan = new Scanner(new FileReader(fileName));
}
public void readLines() { // reads lines, hands each to processLine
while (scan.hasNext()) {
processLine(scan.nextLine());
}
scan.close();
}
public void processLine(String line) { // does the real processing work
System.out.println(line);
}
}
如果需要更多信息,请与我们联系。
违规阻止
int m = (int)(j - 'a');
if(m <= 25){
}
答案 0 :(得分:2)
您的错误在scores[m]
。如果您选择超出scores
长度(或小于)的数组位置,那么您将获得Out of Bounds Exception。您需要先检查阵列的长度。计算j - 'a'
产生负数。
最后,确保m
不小于零。您正在检查它是否小于25。
以下是指向ASCII table的链接。有char
小于&#39; a&#39;在表中。因此,您需要调整逻辑。
由于您只使用大概小写字母,因此在减去之前需要确保字符值介于97和122之间。所以,你可以通过说:
来比较这些字母if (j < 'a' || j > 'z')
{
continue;
}
答案 1 :(得分:1)
可能m
是否定的。你只能测试25或更少。
在进行计算之前,请确保j
(为什么将其命名为j
?)代表一封信。
if (j < 'a' || j > 'z') {
continue;
}
或者,或者,使用标记器确保奇怪的字符不是“单词”的一部分。取决于你想去的地方。