2016-03-10 6 views
2

Мне нужно получить предыдущий элемент LinkedHashMap. Я попытался использовать ListIterator, потому что он имеет метод previous(). Но проблема в ListIterator нуждается в списке, а не в наборе.Получить предыдущий элемент LinkedHashMap

ListIterator<Entry<String, Integer>> it = (ListIterator<Entry<String, Integer>>) unitsItems.entrySet().iterator(); 

Мне нужно преобразовать свой пункт ввода в список. Так что я попытался это:

List entryList= new ArrayList (unitsItems.entrySet()); 
    ListIterator<Entry<String, Integer>> it = (ListIterator<Entry<String, Integer>>) entryList.iterator(); 

Я получил эту ошибку:

java.util.ArrayList$Itr cannot be cast to java.util.ListIterator 

Может кто-нибудь сказать мне правильный способ преобразовать набор в список, а затем использовать его в ListIterator? Спасибо.

+0

на 'Map # entrySet()' вы получите 'Set' * вид * из записей, которые не обеспечивают' ListIterator' , только 'Iterator' –

+1

Попробуйте' entryList.listIterator() '. – Thomas

+0

@ Томас: Он работает! Я не заметил, что использовал iterator(). Пожалуйста, напишите ответ, и я приму его. Спасибо. – AIR

ответ

1

По запросу: С вами уже есть список entryList, вам просто нужно позвонить listIterator(), чтобы получить то, что вы хотите.

Btw, я хотел бы добавить общий тип в списке, а также: List<Entry<String, Integer>> = new ArrayList<>(unitsItems.entrySet());

+0

Я сделаю это, спасибо! – AIR

0

Использование entrySet() неверно, так как это метод HashMap и, следовательно, он не содержит понятия списка (таким образом, ваши проблемы).

Как вы можете видеть из sources, связанный список реализован непосредственно на уровне LinkedHashMap.

Это означает, что для того, чтобы делать то, что вам нужно (поскольку API не предоставляет способ), вам необходимо подклассифицировать LinkedHashMap и сделать это самостоятельно.

0

Если вы используете Java 8, вы можете сделать это:

@Test 
public void obtainListIterator() { 

    LinkedHashMap<String, String> test = new LinkedHashMap<>(); 
    test.put("1", "a"); 
    test.put("2", "a"); 
    test.put("3", "a"); 

    ListIterator<Map.Entry<String, String>> listIterator = 
                 test 
                  .entrySet() 
                  .stream() 
                  .collect(Collectors.toList()) 
                  .listIterator(); 

    assertThat(listIterator.next().getKey()).isEqualTo("1"); 
    assertThat(listIterator.previous().getKey()).isEqualTo("1"); 
} 

Однако ответ, данный @Thomas лучше, чем у меня:

ListIterator<Map.Entry<String, String>> listIterator = new LinkedList(test.entrySet()).listIterator(); 
+0

Это только случайно, что новый список собран, как и исходный связанныйHashMap, поскольку спецификация не гарантирует, что entrySet() находится в любом конкретном порядке. –

+0

Я так не думаю @ A.Rama, потому что 'LinkedHashMap' имеет собственную реализацию' entrySet'. Он создает 'LinkedEntrySet' для хранения записей – jfcorugedo

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