2014-09-11 4 views
1

У меня есть LinkedHashMap, который меняет порядок вставки, когда я получаю значения из него. Любые идеи почему?LinkedHashMap сортировать по ключам

private final Map<Long, DD> cachedPlansById=new LinkedHashMap<Long, DD>(); 
cachedPlansById.put(dd.getId(), dd); 

Значение из дао, когда вставляются в LinkesHashMap идти в этом заказе запасного>

dao Spring 6 
dao Fall 5 
dao Annual 4 
dao Spring 2010 3 
dao Fall 2009 2 
dao Annual 2010-2011 1 

Но когда я извлечь их из LinkedHashMap, они заказаны как this->

valu Annual 2010-2011 1 
valu Fall 2009 2 
valu Spring 2010 3 
valu Annual 4 
valu Fall 5 
valu Spring 6 

Я использую этот цикл:

for (Map.Entry<Long, PaymentPlan> m:cachedPlansById.entrySet()){ 
     System.out.println("valu "+m.getValue().getName()+" "+m.getValue().getId()); 
} 
+1

Дайте нам воспроизводимый пример. –

+0

Итак, вопрос в том, почему LinkedHashMap является экземпляром HashMap, а не LinkedHashMap? – JayB

ответ

2

Не могли бы вы предоставить нам фрагмент кода, в который вставлены ваши значения?

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

Map<Long, String> cachedPlansById = new LinkedHashMap<Long, String>(); 
    cachedPlansById.put(6L, "Spring"); 
    cachedPlansById.put(5L, "Fall"); 
    for (Map.Entry<Long, String> m : cachedPlansById.entrySet()) { 
     System.out.println(m.getValue() + " " + m.getKey()); 
    } 

Результат:

Spring 6 
Fall 5 

Просто для информации, LinkedHashMap также имеет конструктор, где следует порядок доступа вместо заказа вставки.

специальный конструктор служит для создания связанного хэш-карта которого порядок итерации порядок, в котором его записи были последними доступ, из наименее недавно обращались к наиболее недавно (доступ порядка). Такая карта хорошо подходит для создания кэшей LRU . Вызов метода put или get приводит к доступу к соответствующей записи (если она существует после завершения вызова ). Метод putAll генерирует один доступ к записи для каждого сопоставления на указанной карте в порядке, в котором сопоставления значений ключа равны , предоставленным указанным итератором ввода указанной карты. Никакие другие методы не создают входные обращения. В частности, операции над представлениями коллекции не влияют на порядок итерации карты поддержки.

+0

Я предполагаю, что я вызываю конструктор порядка доступа, потому что мой вывод является обратным порядку вставки. Я должен убедиться, что вы вызываете конструктор порядка вставки, я думаю. Благодарю. И я проверил свой код для ввода записей на карте, я печатаю ключи и значения перед тем, как положить их, поэтому я знаю, что они в правильном порядке. – JayB

+0

Я не думаю, что это проблема. Чтобы вызвать конструктор порядка доступа, вы бы назвали «Map cachedPlansById = new LinkedHashMap (5, 5f, true);' Можете ли вы поделиться частью, в которую вы вставляете значения? –

+0

Я решил проблему, я думаю. Я сделал экземпляр HashMap, он вернул true, но когда я делаю instanceof LinkedHashMap, он возвращает false. Не уверен, почему он создает экземпляр HashMap. И я вставляю значения в оператор put. – JayB

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