Мы должны написать базовую программу, которая должна считывать список слов из файла, находить перестановки слов и хранить все слова, имеющие одинаковую нормализованную версию, вместе в одной цепочке.нормализованная версия всегда лежит сверху цепи.Нормализованное слово должно использоваться в качестве ключа индекса, в то время как перестановки слова должны возвращаться в виде массива строк в указанном месте 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();
наша программа вылетает.
Кроме того, мы не можем распечатать все значения с индексом 0 в нашем currentChain
.Мы окружили соответствующий метод print блоком try-catch, иначе наша программа вылетала бы;Теперь наша программа запускается, но редко выдает строку и, скорее, выдает исключение при запуске метода печати:
try {
String a = currentChain.get(0);
System.out.println(a);
} catch (Exception e) {
e.printStackTrace();
}
Функция трассировки стека выводит следующую ошибку:
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
s?В чем может быть причина того, что мы не можем правильно хранить наши строки в нашем ArrayList большую часть времени?