Хобрук: Ваш путь к мастерству в программировании

Добавление элемента в HashMap в ArrayList HashMap в Java

У меня есть исходный HashMap на Java:

HashMap<String, Integer> keyWordFrequencies;

Хранение ключевых слов различной длины. Я хочу пройтись по этой HashMap и вычислить длину ngram, хранящихся в части String карты, которая определяет текст каждого ключевого слова.

Этими данными я хочу заполнить целевой ArrayList HashMaps:

ArrayList<HashMap<String, Integer>> keywordNgrams;

С результатами, где индекс ArrayList соответствует размеру ngram заданного ключевого слова минус один, т. е. keywordNGrams (0) получит униграммы, keywordNGrams (1) получит биграммы и так далее. Но я не уверен в необходимом синтаксисе. Обход исходного HashMap достаточно прост:

Set keyWordFrequenciesSet = keyWordFrequencies.entrySet();
Iterator keyWordFrequenciesIterator = keyWordFrequenciesSet.iterator();
while(keyWordFrequenciesIterator.hasNext()) {
   Map.Entry m = (Map.Entry) keyWordFrequenciesIteratorIterator.next();
   int ngramLength = String_Utils.getLengthOfNgram(m.getKey().toString());

   Add element to keywordNgrams?

Но добавление элемента в целевой ArrayList HashMap меня смущает. Я пытался:

keywordNgrams.add(ngramLength, m);

И разные варианты, но безрезультатно. m должен быть элементом HashMap, а не HashMap сам по себе. Кто-нибудь может подсказать, где я ошибаюсь?

В идеале я хотел бы один раз пройтись по исходному HashMap keyWordFrequencies, а для начала массив keywordNgrams инициализируется до максимально возможного размера ngram.

12.09.2012

  • Прежде чем вы начнете, вы уже знаете, какой будет наибольший размер ngram? То есть знаете ли вы, каким будет конечное значение keywordNgrams.size()? Если это так, то вам лучше предварительно заполнить keywordNgrams до этого размера; если нет, то всякий раз, когда вы сталкиваетесь с большим ngram, чем вы видели раньше, вам понадобится цикл для расширения keywordNgrams до желаемого размера. 12.09.2012
  • да, я знаю это. Максимальная длина ngram должна быть 5. 12.09.2012
  • keywordNgrams.add(ngramLength, m); не будет работать, потому что m является экземпляром Map.Entry, а не экземпляром HashMap. Вы уверены, что хотите ArrayList<HashMap>, а не ArrayList<Map.Entry>? С ArrayList<HashMap> вы будете создавать список из 5 элементов, каждый из которых будет точно таким же HashMap, что я сомневаюсь, что вы намереваетесь. 12.09.2012
  • А затем получить доступ к ключу и значению через сам m? Звучит многообещающе. 12.09.2012
  • Спасибо респондентам: утром попробую и посмотрю. 12.09.2012

Ответы:


1

Поскольку вы знаете наибольший размер ngram, я рекомендую предварительно заполнить keywordNgrams:

List<Map<String, Integer>> keywordNgrams =
    new ArrayList<Map<String, Integer>>();
for(int i = 0; i < 5; ++i)
    keywordNgrams.add(new HashMap<String, Integer>());

Затем вы можете написать:

for(final String keyword : keyWordFrequencies.keySet())
    keywordNgrams.get(String_Utils.getLengthOfNgram(keyword) - 1)
            .put(keyword, keyWordFrequencies.get(keyword));
12.09.2012
  • Это заполнит целевые ключевые слова Ngrams HashMaps правильными ngrams, но без их частоты из исходного keyWordFrequencies. Но удалив if...else с помощью: map.put(key.toString(), ((Integer) keywordFrequencies.get(key.toString())).intValue()); кажется, все в порядке. Большое спасибо. 14.09.2012
  • @MrMorgan: А, понятно. Я не мог понять, почему ваша исходная карта была от String до Integer, но теперь я понял. Я обновлю свой ответ соответственно. 14.09.2012
  • @MrMorgan: я обновил свой ответ. Как видите, вам не нужно использовать key.toString(), и вам не нужно приводить к Integer, пока вы сохраняете типы для начала: поскольку keyWordFrequencies имеет тип HashMap<String, Integer>, о приведениях уже нужно позаботиться. для вас компилятором. 14.09.2012
  • ФАО руах: Я попробовал ваш измененный код, и он работает хорошо. Чтобы немного прояснить ситуацию, мне нужно использовать выделенные целевые HashMaps для записи количества раз, когда каждый ngram встречается в исходных HashMaps, то есть keywordNgrams(0) хранит униграммы, keywordNgrams(1) хранит биграммы и их частоты, а keywordNgrams(2) хранит триграммы и так далее. на. Я полагаю, что альтернативой было бы просто иметь одну действительно длинную целевую HashMap, хранящую все uni, bi и trigrams вместе, но это, возможно, менее гибко. Спасибо за вашу помощь. 14.09.2012

  • 2

    Поскольку вы имеете дело с ArrayList размером 5, я бы посоветовал, когда вы инициализируете свой ArrayList, делать это, добавляя новый экземпляр HashMap в каждый индекс. Что-то вроде этого:

    ArrayList<HashMap<String, Integer>> keywordNgrams = new ArrayList<HashMap<String, Integer>> ();
    
    for(int index = 0; index < 5; index++){
      keywordNgrams .put(index, new HashMap<String, Integer>());
    }
    

    Чтобы добавить элементы в ваш ArrayList, вот что вам нужно сделать:

    Пример кода может быть примерно таким:

    HashMap<String, Integer> returnedMap = keywordNgrams.get(index); //where index is the position in the list;
    returnedMap.put(key, value); //where key & value is the information that you would want to add to your HashMap
    keywordNgrams.set(index, returnedMap);
    
    12.09.2012
    Новые материалы

    Обнаружение маски или без маски с YOLO😷
    Это руководство по созданию пользовательской модели обнаружения объектов для обнаружения людей, носящих или не носящих маски в общественных местах, созданной с использованием YOLO v3. Модель..

    Управление приборами в чистом PHP
    Этот пост дополняет эти: E2e тестирование Работа с несколькими средами . Мы разработали это решение для базы данных MariaDB, оно может отличаться, если вы используете другую базу..

    Неделя 1 — Кентерберийские рельсы.
    Неделя 1 — Кентерберийские рельсы. So. Мы все еще живы, все еще усердно работаем и еще не пассивно-агрессивно рассылаем друг другу сообщения «за мое последнее сообщение в Slack…», поэтому, на..

    Цена завтрашнего дня  — Джефф Бут
    Технологический прогресс в наши дни происходит с молниеносной скоростью, и мы не в состоянии это понять. Джефф в основном говорит о влиянии технологий на экономику по всему миру. Он твердо верит..

    Данные: суперсила современного бизнеса
    В цифровой среде данные превратились из простого побочного продукта бизнес-операций в центральный актив, стимулирующий рост и инновации. Крейг Манди, бывший главный директор по стратегии..

    Как симулировать серию пенальти на Python с помощью симуляции Монте-Карло, часть 1: генерация функций
    Серия пенальти была огромным испытанием во время чемпионата мира по футболу. Они вызвали много споров в социальных сетях и новостных агентствах. Даже финальный матч турнира решался по..

    AST для разработчиков JavaScript
    TL; DR Эта статья - мое выступление на недавно состоявшейся конференции Stockholm ReactJS Meetup. Вы можете посмотреть слайды здесь..