Таким образом, у меня есть карта, которую я создал (вставленные данные) в порядке, я хотел. При парсинге карты 1-й ключ, возвращенный в foreach, не является первым ключом, который я вставил. Существует ли путь к этому для случая?
Также сортировка моей карты является видом хитрой причины, это должно быть отсортировано по Значению и в определенном поле в Значении. Ty
Давайте посмотрим. Ваши требования выглядят так:
Не существует единого стандартного класса коллекций Java, удовлетворяющего всем этим требованиям. И я не думаю, что коллекции Commons или Google были бы…
Если бы вы отбросили требование 3, тогда TreeSet
(созданный с помощью специального Comparator
) сделает свою работу. Если вы откажетесь от требования 4, то LinkedHashMap
выполнит эту работу.
Чтобы удовлетворить все требования, вам необходимо выполнить одно из следующих действий:
Используйте LinkedHashMap
, и если вы хотите выполнить итерацию в некотором порядке, зависящем от значений, извлеките значения карты
, отсортируйте ее с помощью настраиваемого компаратора и
вернуть итератор для отсортированной коллекции.
Используйте как LinkedHashMap
, так и TreeMap
, и обновляйте их параллельно.
Создайте собственный класс фасада для LinkedHashMap
и TreeMap
. Это должно поддерживать актуальность обеих структур данных при вызове put
, remove
и т.д., а также предоставлять дополнительные методы для получения отсортированных значений.
Если вы можете отсортировать элементы заранее по атрибуту значения, вы можете использовать LinkedListHashMap
, поскольку это сохраняет указанный вами порядок. Однако это кажется немного хрупким и не подходит, если вам понадобится позже добавить на карту дополнительные элементы.
Альтернативой является сохранение значений в списке, отсортированном по мере необходимости, и использование двоичного поиска для извлечения элементов и поиска точки вставки для новых элементов.
Вы даже можете обернуть все это и поместить за интерфейс Map
.
Класс Collections предоставляет binarySearch . Вот схема:
Список значений
. 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, он будет сериализуемым.
Ознакомьтесь с http://java.sun.com/j2se/1.4.2/docs/api/java/util/LinkedHashMap.html для реализации карты с предсказуемый порядок итераций. Вы также можете рассмотреть возможность использования списка, если вы на самом деле не выполняете поиск по ключам.