【发布时间】:2014-01-24 07:17:21
【问题描述】:
所以现在是大学的寒假,我正在努力保持编码,所以我只是为我们在课堂上只讨论过但从未编码过的程序和算法编写代码。无论如何,我今天正在做的一个程序是你给计算机一个打乱的单词,它会输出所有可以由这些字母组成的单词(来自我们给出的 EnglishWordList 文件)。
不管怎样,这是我到目前为止的代码:
import java.io.*;
import java.util.*;
public class ProdFinder {
private HashMap<Character, Integer> prodFinder = new HashMap<Character, Integer>();
private HashMap<Integer, LinkedList<String>> findWord = new HashMap<Integer, LinkedList<String>>();
private static final char[] letters = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r',
's','t','u','v','w','x','y','z'};
private static final int[] primes = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101};
public ProdFinder() throws FileNotFoundException {
for (int i = 0; i < letters.length; i++) {
prodFinder.put(letters[i], primes[i]);
}
Scanner sc = new Scanner(new File("EnglishWordList.txt"));
while (sc.hasNextLine()) {
String str = sc.nextLine();
int strProd = findProduct(str);
if (findWord.containsKey(strProd)) {
LinkedList<String> wordList = findWord.get(strProd);
wordList.add(str);
findWord.put(strProd, wordList);
}
else {
LinkedList<String> wordList = new LinkedList<String>();
wordList.add(str);
findWord.put(strProd, wordList);
}
}
sc.close();
}
public int findProduct(String x) {
int product = 1;
char[] str = x.toCharArray();
for (Character val: str) {
product = product*prodFinder.get(val);
}
return product;
}
public void descramble(String x) {
int prod = findProduct(x);
if (findWord.containsKey(prod)) {
System.out.println("The words that can be formed from the letters in " + x + " are: " +
findWord.get(prod));
}
else {
System.out.println("No words can be formed from the letters in " + x + ".");
}
}
}
现在,错误源于我开始将数字的所有质数乘积放入我的 HashMap 的那一行(尝试将每个质数乘积映射到其字母乘以该数字的单词的 LinkedList。)不知何故,这是抛出例外,当我注释掉那段代码并只运行 findProduct 方法时,它适用于我给它的任何单词以输出素数形式的字母乘积。
关于异常来自何处的任何想法?
编辑:对不起,堆栈跟踪如下:
Exception in thread "main" java.lang.NullPointerException
at ProdFinder.findProduct(ProdFinder.java:44)
at ProdFinder.<init>(ProdFinder.java:22)
at Descramble.main(Descramble.java:7)
据我所知,错误源于我尝试在 str 上调用 findProd 时,在这一行:
int strProd = findProduct(str);
【问题讨论】:
-
请堆栈跟踪! (异常 => 堆栈跟踪 => 快速帮助)
-
或者至少指出你在说哪一行(哪种方法等)
-
或者告诉我们你想用素数做什么......字母如何乘以数字(这与在字典中找到你的单词有什么关系)?
-
我会说你会在这里得到整数溢出,除非你的话都很短。您尝试将单词转换为素数乘积是否有原因?如果这是必要的功能,那么请使用
BigInteger,而不是int。 -
@DavidWallace 动机很明确:通过其组成字符集实现单词的 O(1) 查找。