Java массив хеш-таблиц - PullRequest
5 голосов
/ 27 марта 2011

Мне нужен массив Hashtables в программе, которая хранит все слова из заданного набора документов.

Индекс 1 массива содержит хеш-таблицу String -> Double, в которой хранится слово, и егорассчитывать на документ 1 (индекс массива 100 = хеш-таблица документа номер 100).

Мне не нужна помощь при использовании этой структуры данных, просто при ее создании.Я объявляю массив Hashtable следующим образом:

Hashtable<String,Double>[] h1 = new Hashtable<String,Double>[];

... но это не компилируется.

(ПРИМЕЧАНИЕ: для последующего использования необходимо использовать Double, а не Integer в приведенном выше объявлении.)

ВОПРОС: Как создать массив хеш-таблиц, в котором хранятся String-> Double ???

Любые предложения приветствуются, ребята ....

Ответы [ 8 ]

5 голосов
/ 27 марта 2011

... но это не компилируется.

Это потому, что массив не имеет имени, new ожидает количество элементов, и вы не можете просто выделить массив generics . Предпочитаю List вместо:

List<Hashtable<String,Double>> wordCountPerDoc
  = new ArrayList<Hashtable<String,Double>>();
4 голосов
/ 27 марта 2011

просто используйте

    @SuppressWarnings("unchecked")
    Hashtable<String,Double>[] h = (Hashtable<String,Double>[])new Hashtable<?,?>[10];
    h[0] = new Hashtable<String, Double>();
3 голосов
/ 27 марта 2011

почему бы вам не использовать Map<Integer, Map<String, Double> >?таким образом вы не тратите пространство на несуществующие документы и все равно получаете O (1) извлечение.

2 голосов
/ 27 марта 2011

вы можете создать вот так.

Hashtable<String,Double>[] arr = new Hashtable[10];
1 голос
/ 27 марта 2011

Две вещи: вы не можете объявить массив с такими параметризованными типами;Вы должны подразумевать объявить его new Hashtable[].И вам нужно дать массиву длину.

Смешивание массивов и коллекций, хотя и возможно, может привести к путанице и вызвать проблемы в моем опыте;также HashMap обычно предпочтительнее Hashtable.Поэтому я бы предпочел List<Map<String, Double>> для этого приложения.

0 голосов
/ 31 декабря 2014

Для массива фиксированного размера:

Hashtable<String,Double>[] h1 = new Hashtable[]{new Hashtable< String,Double>(),new Hashtable< String,Double>(),new Hashtable< String,Double>()};
0 голосов
/ 27 марта 2011

Массив кажется необычным выбором структуры здесь.Возможно, вам следует рассмотреть вопрос о хранении ваших хеш-таблиц в списке.Он будет динамически изменяться для вас, если вы не знаете, сколько документов у вас будет заранее.Если вы используете ArrayList, у вас все равно будут постоянные чтения случайных значений (например, массива). Я думаю, что это намного проще, чем использование массива, и вы все равно получаете проверку общего типа.Если вы выбираете Список, ваш синтаксис становится следующим:

List<Map<String,Double>> documentWordCounts = new ArrayList<Map<String,Double>>();

Или выберите LinkedList в зависимости от того, какой шаблон чтения / записи вы хотите.

0 голосов
/ 27 марта 2011

Причины, по которым эта ошибка описана в разделе часто задаваемых вопросов об Анжелике Лангер: Можно ли создать массив, тип компонента которого является конкретным параметризованным типом?

Могу ли я создать массив, тип компонента которого является конкретным параметризованным типом?

Нет, поскольку он не является типобезопасным.

Массивы являются ковариантными, чтоозначает, что массив ссылок на супертипы является супертипом массива ссылок на подтипы.То есть Object[] является супертипом String[], и к строковому массиву можно получить доступ через справочную переменную типа Object[].

Массивы и универсальные элементы могут иметь нечетные взаимодействия (в основном из-зареализация компромиссов для поддержки совместимости).Возможно, вам будет лучше (как Ларсман предложил ), если посмотреть на подходящий тип коллекции, такой как Список из Карта с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...