2015-07-20 2 views
3

У меня есть LinkedHashMap, у меня есть ключ как идентификатор, то, что я пытаюсь достичь, - это чтобы я мог искать идентификатор, и если он присутствует, имеет итератор от этой записи до конца карты. То, что я пытался до сих порИтератор от определенного объекта в LinkedHashMap

Map<String, Obj> map = new LinkedHashMap<>(); 
Iterator it = map.entrySet().iterator(); 

Но есть способ, я могу получить итератор, чтобы начать с конкретного объекта, не делая линейный поиск и найти его сам?

ответ

0

Нет, это невозможно для LinkedHashMap. Есть способ tailMap в интерфейсе NavigableMap, который может помочь вам сделать это (map.tailMap(key).iterator()), но этот интерфейс не реализован LinkedHashMap Если TreeMap (возможно, с пользовательским компаратором) является подходящей заменой в вашем случае, подумайте над его использованием.

+0

Ну, мне нужно, чтобы порядок вставки поддерживался, я не совсем уверен, что TreeMap делает это? Я читаю об этом, хотя. –

1

Нет, такой функции нет в LinkedHashMap.

Но вы можете имитировать его с List за счет только одного обхода:

Map<String, Object> map = new LinkedHashMap<>(); 
    Map<String, Integer> indexesMap = new HashMap<>(map.size()); 

    int index = 0; 
    for (String key : map.keySet()) { 
     indexesMap.put(key, index++); 
    } 

    List<Entry<String, Object>> entries = new ArrayList<>(map.entrySet()); 

    // ... 

    String key = ... 

    Iterator<Entry<String, Object>> iterator = entries.listIterator(indexesMap.get(key)); 

На каждом последующем вызове entries.listIterator вы получите итератор с O (1) сложности.

EDIT

Если вы хотите абсорбция быть O (1), то вы не должны использовать LinkedHashMap.

Вы можете реализовать свой собственный двунаправленный список и сохранить его узлы в HashMap. Затем выполните поиск узла по ключу с карты. Когда вы получаете узел, вы можете перемещать остальные последующие записи из связанного списка, или вы можете удалить его в O (1), удалив его как с карты, так и с связанного списка.

+0

Это решение, которое я использую в настоящее время, но когда у меня есть удаление в середине списка, мне нужно обновить карту с этой позиции! У меня есть частые изменения и удаления. Я знаю, что это звучит так, как будто я слишком много прошу, но убедившись, что для этого нет решения для полки. –

+0

@ AadiDroid Хорошо, я не знал об этом. См. Мой отредактированный ответ. –

Смежные вопросы