Хранение значений с повторяющимися ключами в TreeMap, HashMap или LinkedHashMap

В настоящее время я работаю над проектом, в котором я получаю данные об именах с веб-сайта социального обеспечения. В основном мне дается число x и годы y и z. Я должен вернуть первые x имен за каждый год с y по z.

Таким образом, данные, возвращаемые с веб-сайта, — это имя, звание и год. Мне нужно ввести каждое имя, возвращенное в TreeMap, HashMap или LinkedHashMap, но я не уверен, как их сохранить, потому что независимо от того, что я использую в качестве ключа, могут быть дубликаты. Год не может быть ключом, так как у меня будет X лучших имен за каждый год, так что все они будут из одного года. Если есть несколько лет, будет несколько имен ранга 1 и т. д., поскольку для каждого года есть по одному, так что это не может быть ключом. И само имя не могло быть ключом, поскольку одно и то же имя могло быть в топе нескольких имен на протяжении нескольких лет.

Мне удалось понять большую часть сложных частей этого проекта, но вот эту, одну из самых простых частей, я никак не могу понять!

Я слышал о способах, которыми я могу использовать что-то вроде года в качестве ключа и сделать значение списком имен или чем-то подобным, но я не уверен, как бы я добавлял значения в подобных реализациях. Буду очень признателен за любые рекомендации!

Большое спасибо.

Изменить: обратите внимание, что мне специально сказали, что я ДОЛЖЕН использовать TreeMap, HashMap или LinkedHashMap. Я слышал о MultiMap, но это не один из моих вариантов.


person Community    schedule 09.12.2013    source источник
comment
Найдите Мультикарту. Их также можно эмулировать с помощью HashMap<K,List<V>>, если это действительно то, чего требует подход.   -  person user2864740    schedule 09.12.2013
comment
Попробуйте следующее: java.dzone.com/articles/multimaps-google-guava   -  person Anupam Saini    schedule 09.12.2013
comment
возможный дубликат реализации карты с повторяющимися ключами   -  person Ruchira Gayan Ranaweera    schedule 09.12.2013


Ответы (1)


Я думаю, используя хэш-карту со списком List это то, о чем вы конкретно просите. Примером того, как создать экземпляр такого объекта, может быть:

HashMap<Integer, List<String>> myHashMap = new HashMap<Integer, List<String>>();

Обратите внимание, что мы должны использовать Integer, потому что Hashmaps работают только с объектами. Чтобы добавить к этому значения, вы можете сделать:

myHashMap.get([whatever year you wanted]).add("[whatever name you want]");

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

if (!myHashMap.containsKey(myYear)) {
    myHashMap.put(myYear, new List<String>());
}

Редактировать: Если вы также не можете использовать список внутри, я полагаю, вы могли бы поместить внутрь еще одну хэш-карту, но я не вижу в этом большого реального применения, если только это не просто произвольное требование.

person Sammaron    schedule 09.12.2013
comment
Я бы предложил сделать это более общим: Map‹Integer,List‹String›› myMap = new HashMap‹Integer, List‹String››(); - person bcorso; 09.12.2013
comment
Согласованный! Редактирование для использования списков. Спасибо! - person Sammaron; 09.12.2013
comment
Технически вы также должны использовать Map вместо HashMap. - person bcorso; 09.12.2013
comment
Карта выглядит лучше на основе этот вопрос, но я думаю, что технически HashMap тоже должен быть в порядке , правильно? Я оставил его с HashMap, просто чтобы убедиться, что ее спецификация определенно соответствует (хотя кажется глупым накладывать такие ограничения...) - person Sammaron; 09.12.2013
comment
Вы почти всегда используете интерфейсы при определении типов, если только вам не нужны методы, специфичные для реализации. В этом случае вы используете только методы «put», «get» и «containsKey», поэтому нет причин определять тип как HashMap, поскольку Map содержит эти методы и является более общим. Разумеется, это относится только к левой части определения. Правая сторона остается HashMap, потому что вы не можете создать экземпляр интерфейса. - person bcorso; 09.12.2013