Scrabblecheater в Java: как правильно писать во вложенный ArrayList - PullRequest
1 голос
/ 08 января 2011

Мы должны написать базовую программу, которая должна считывать список слов из файла, находить перестановки слов и хранить все слова, имеющие одинаковую нормализованную версию, вместе в одной цепочке.нормализованная версия всегда лежит сверху цепи.Нормализованное слово должно использоваться в качестве ключа индекса, в то время как перестановки слова должны возвращаться в виде массива строк в указанном месте 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 большую часть времени?

Ответы [ 2 ]

1 голос
/ 08 января 2011

Mutimap - это структура данных, которую вы ищете.

Коллекция, похожая на карту, но который может связывать несколько значений с одним ключом. Если вы звоните положить (K, V) дважды, с тем же ключом, но разные значения, мультикарта содержит сопоставления от ключа к обоим значения.

0 голосов
/ 08 января 2011

Если вы хотите исправить свой код, вам нужно знать, что элементы списка массивов не инициализированы.

Измените конструктор и 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;

, что также означает обновление декалирования переменной цепочки из хеш-метода до этого

List<List<String>> chain = table[hashValue];

Наслаждайтесь.

...