Если вы можете отсортировать ваши элементы заранее по атрибуту value, тогда вы можете использовать LinkedListHashMap
, поскольку это сохраняет указанный вами порядок. Тем не менее, это выглядит немного хрупким и не подходит, если вам нужно позже добавить больше элементов на карту.
Альтернативой является сохранение значений в списке, отсортированных по мере необходимости, и использование двоичного поиска для извлечения элементов и поиска точки вставки для новых элементов.
Вы можете даже обернуть все это и поместить его в Map
интерфейс.
Класс Collections предоставляет binarySearch . Вот схема:
- Поместите свой класс Value в список,
List<Value> values
.
- Реализуйте класс
Comparable<Value>
, который сравнивает значения, используя атрибут, по которому вы хотите их отсортировать.
- Используйте
Comparator<Value>
для сортировки списка.
- Теперь, когда список отсортирован, вы можете использовать
Collections.binarySearch(values, aValue, Comparator<Value>)
, чтобы найти индекс фактического значения. Обратите внимание, что 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, он будет сериализуем.