我们必须编写一个基本程序,它应该从文件中读取单词列表,查找单词的排列,并将所有具有相同标准化版本的单词存储在一个链中。规范化版本始终位于链的顶部。 标准化的单词应该用作索引键,而单词的排列应该作为给定的hsah位置中的字符串数组返回。
我们尝试使用嵌套的ArrayList实现索引键的存储和排列。
private File testfile = new File("wordlist.txt");
private ArrayList<ArrayList<String>>[] table;
int entries = 0;
public Dictionary(int size) {
table = new ArrayList[size];
for (int i = 0; i < size; i++)
table[i] = new ArrayList<ArrayList<String>>(99);
}
public void newDictionary() {
for (int i = 0; i < table.length; i++)
table[i] = new ArrayList<ArrayList<String>>(99);
}
我们的哈希函数如下所示:
public void hash(String word) {
word = word.toLowerCase();
String id = normalize(word);
int hashValue = 0;
char[] chars = word.toCharArray();
for (int i = 0; i < chars.length; i++) {
int e = chars[i] - 97;
hashValue += e * 26 ^ i;
}
if (hashValue < 0)
hashValue = hashValue * (-1);
ArrayList<ArrayList<String>> chain = table[hashValue];
boolean newList = true;
boolean cB = chain.isEmpty();
if (chain.size() > 0) {
for (int i = 0; i < chain.size(); i++) {
ArrayList<String> currentChain = chain.get(i);
try {
String a = currentChain.get(0);
System.out.println(a);
} catch (Exception e) {
System.out.println("ERROR!");
}
}
}
if (newList == true || chain.size() == 0) {
chain.add(new ArrayList<String>());
chain.get(0).add(0, id);
chain.get(0).add(word);
}
}
我们假设我们正确实现了嵌套的ArrayList,但在尝试访问ArrayList<ArrayList<String>> chain = table[hashValue];
时,例如通过调用boolean cB = chain.isEmpty();
,我们的程序崩溃了。
除此之外,我们无法在currentChain
内的索引0处打印出所有值。
我们用try-catch块包围了各自的print方法,否则我们的程序会崩溃;现在,我们的程序运行,但很少输出一个String,而是在运行print-method时抛出异常:
try {
String a = currentChain.get(0);
System.out.println(a);
} catch (Exception e) {
e.printStackTrace();
}
stacktrace输出以下错误:
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at Dictionary.hash(Dictionary.java:78)
at Dictionary.readFromFile(Dictionary.java:32)
at Main.main(Main.java:9)
我们对以下Index: 0, Size: 0
我们是否正确实现了嵌套ArrayList
?
可能是因为我们大多数时候无法在StringList中正确存储我们的字符串?
答案 0 :(得分:1)
Mutimap是您要查找的数据结构。
类似于地图的集合,但是 这可能会关联多个值 用一把钥匙。如果你叫put(K, V)两次,使用相同的键但是 不同的值,多图 包含从键到两者的映射 值。
答案 1 :(得分:0)
如果要修复代码,则需要知道数组列表的元素未初始化时。
更改构造函数和newDictionary()
方法:
public Dictionary(int size) {
//noinspection unchecked
table = new ArrayList[size];
newDictionary();
}
public void newDictionary() {
for (int i = 0; i < table.length ; i++) {
table[i] = new ArrayList<List<String>>(99);
for ( int j = 0; j < 99; j++ ) {
table[i].add(new ArrayList<String>());
}
}
}
我还会将表成员的声明更改为:
private List<List<String>>[] table;
这意味着还要将链变量的decalration从哈希方法更新为此
List<List<String>> chain = table[hashValue];
享受。