Реализация упорядоченной карты списка в Java - PullRequest
19 голосов
/ 31 июля 2009

Мне было интересно, есть ли класс, который реализует интерфейсы Map и List в Java.

У меня есть структура данных, в первую очередь Map. Я сопоставляю строки (идентификаторы) с Image с. Но в определенной части моего кода мне нужно предоставить пользователю все доступные идентификаторы Images. Пока что единственный способ сделать это - написать так:

for (String id : myMap.keySet()) {
    // get the image like this "myMap.get(id)" 
}

Так что было бы неплохо иметь класс, который реализует как Map, так и List, чтобы я мог просто написать:

for (Image img : myMap) {
  // the image is img
}

Кто-нибудь знает о такой реализации?

РЕДАКТИРОВАТЬ : После просмотра ответов (которые являются правильными, проголосовали), я теперь понимаю, что мне также понадобится отсортировать карту. Когда я говорю «отсортировано», все, что я имею в виду, это то, что я хотел бы, чтобы значения были в определенном порядке, который я мог бы изменить. Я знаю, что это не оригинальный вопрос, но я только что понял, что мне это нужно.

РЕДАКТИРОВАТЬ 2 : Кажется, я нерешительный. Мне нужна упорядоченная карта, а не отсортированная. Извините за путаницу, люди.

Ответы [ 7 ]

35 голосов
/ 31 июля 2009

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

19 голосов
/ 31 июля 2009

Для заказа карты, посмотрите на LinkedHashMap. Это сохранит ваши ключи в порядке вставки.

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

То, что вы можете использовать, это map.entrySet(). Это позволит вам перебирать множество MapEntries.

Проверьте javadoc для получения дополнительной информации.

8 голосов
/ 31 июля 2009

У вас уже есть куча практических ответов. Но отвечая прямо на вопрос ...

Я бродил, есть ли класс, реализующий интерфейсы Map и List в Java.

... стоит отметить, что это просто невозможно. remove(Object) метод является препятствием.

В Map интерфейсе его подпись:

V remove(Object key);

А в List интерфейсе это:

boolean remove(Object o);
3 голосов
/ 31 июля 2009

Вы можете использовать метод Map.values(), который возвращает Collection.

2 голосов
/ 31 июля 2009

Попробуйте это:

for (Image img : myMap.values()) {
    // the image is img
}

Для отсортированной карты посмотрите на java.util.SortedMap реализации. java.util.TreeMap является наиболее частым выбором. Если вам нужен только гарантированный порядок итераций, вы можете попробовать java.util.LinkedHashMap. Он предлагает итерацию в том же порядке, в котором вы размещаете элементы на карте. Или, опционально, в порядке последнего доступа. Если вы хотите переместить ключ (после добавления) в конец карты, вы должны явно удалить его и поставить снова.

2 голосов
/ 31 июля 2009

Это дает вам набор сохраненных значений

myMap.values()
0 голосов
/ 31 июля 2009

вы можете использовать TreeMap , он сортируется в соответствии с естественным упорядочением его ключей или компаратором, предоставленным во время создания карты:

TreeMap<String, Image> mapByName = new TreeMap<String, Image>(new ByNameComparator());

где ByNameComparator () - Компаратор. В качестве альтернативы вы можете использовать значения () methond и сортировать, используя Collections.sort ():

Collection<Image> images = mapByName.values();
Collections.sort(images, new BySizeComparator());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...