Как я анализирую карту (foreach) в том же порядке, я создал его (JAVA)

Таким образом, у меня есть карта, которую я создал (вставленные данные) в порядке, я хотел. При парсинге карты 1-й ключ, возвращенный в foreach, не является первым ключом, который я вставил. Существует ли путь к этому для случая?

Также сортировка моей карты является видом хитрой причины, это должно быть отсортировано по Значению и в определенном поле в Значении. Ty

7
задан weakwire 22 May 2010 в 23:58
поделиться

3 ответа

Давайте посмотрим. Ваши требования выглядят так:

  1. У вас есть набор пар ключ / значение, где ключи уникальны.
  2. Вы хотите иметь возможность выполнять быстрый поиск значения для данного ключа.
  3. Вы хотите иметь возможность перебирать ключи (или пары) в порядке вставки.
  4. Вы хотите иметь возможность перебирать значения в порядке некоторого поля типа значения.

Не существует единого стандартного класса коллекций Java, удовлетворяющего всем этим требованиям. И я не думаю, что коллекции Commons или Google были бы…

Если бы вы отбросили требование 3, тогда TreeSet (созданный с помощью специального Comparator ) сделает свою работу. Если вы откажетесь от требования 4, то LinkedHashMap выполнит эту работу.

Чтобы удовлетворить все требования, вам необходимо выполнить одно из следующих действий:

  • Используйте LinkedHashMap , и если вы хотите выполнить итерацию в некотором порядке, зависящем от значений, извлеките значения карты , отсортируйте ее с помощью настраиваемого компаратора и вернуть итератор для отсортированной коллекции.

  • Используйте как LinkedHashMap , так и TreeMap , и обновляйте их параллельно.

  • Создайте собственный класс фасада для LinkedHashMap и TreeMap . Это должно поддерживать актуальность обеих структур данных при вызове put , remove и т.д., а также предоставлять дополнительные методы для получения отсортированных значений.

4
ответ дан 7 December 2019 в 03:12
поделиться

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

Альтернативой является сохранение значений в списке, отсортированном по мере необходимости, и использование двоичного поиска для извлечения элементов и поиска точки вставки для новых элементов.

Вы даже можете обернуть все это и поместить за интерфейс Map .

Класс Collections предоставляет binarySearch . Вот схема:

  • Поместите свой класс Value в список, Список значений .
  • Реализуйте класс Comparable , который сравнивает значения с использованием атрибута, по которому вы хотите их отсортировать.
  • Используйте Comparator для сортировки списка.
  • Теперь, когда список отсортирован, вы можете использовать Collections.binarySearch (values, aValue, Comparator ) , чтобы найти индекс фактического значения. Обратите внимание, что aValue не является реальным значением - это значение с атрибутами, установленными для предоставления ключа, но остальная часть не инициализирована. Значение aValue используется только для хранения ключа сортировки.

В коде

List<Value> values = new ArrayList<Values>();
// .. add values
values.add(new Value(key, data1, data2, etc..));
Comparator<Value> compValue = new Comparator<Value>() {
  public int compare(Value v1, Value v2) {
     return v1.getKey()>v2.getKey();
  }
}

Collections.sort(values, compValue);
// now we can search on key
int index = Collections.binarySearch(values, new Value(keyTofind), valueComp);
Value foundValue = null;  // value with the key may not be in the list
if (index>=0) 
   foundValue = values.get(index);

// we can also update the list
Value newValue = new Value(key, data, data2, etc...);
int insert = Collections.binarySearch(values, newValue, valueComp);
// insert will be negative
values.add((-insert)-1, newValue);

РЕДАКТИРОВАТЬ: если вы заключите это в интерфейс карты, например расширяя AbstractMap, он будет сериализуемым.

0
ответ дан 7 December 2019 в 03:12
поделиться

Ознакомьтесь с http://java.sun.com/j2se/1.4.2/docs/api/java/util/LinkedHashMap.html для реализации карты с предсказуемый порядок итераций. Вы также можете рассмотреть возможность использования списка, если вы на самом деле не выполняете поиск по ключам.

5
ответ дан 7 December 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: