Получить дополнительный набор LinkedHashMap и сохранить порядок


В отличие от HashMap, порядок имеет значение в LinkedHashMap. И порядок здесь-порядок вставки.

Пусть у меня есть LinkedHashMap следующего вида (упорядоченный сверху вниз, левая часть-ключ, правая часть-значение):

1: "Один"

2: "Два"

3: "Три"

4: "Четыре"

Тогда у меня есть список ключей, который содержит, скажем, (3,1).

То, что я хочу сделать, это перебрать LinkedHashMap по порядку и выбрать записи, ключ которых находится в списке.

Итак, результат, который я хочу получить (1 все еще перед 3, потому что это порядок перед фильтрацией):

1: "Один"

3: "Три"

Вот мой код:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class SelectCertainEntriesFromLinkedHashMap {
    public static void main(String args[]) {
    Map<Integer,String> linkedHashMap = new LinkedHashMap<Integer,String>();
    linkedHashMap.put(1, "One");
    linkedHashMap.put(2, "Twe");
    linkedHashMap.put(3, "Three");
    linkedHashMap.put(4, "Four");

    List<Integer> list = new ArrayList<Integer>();
    list.add(3);
    list.add(1);

    Map<Integer,String> selectedlinkedHashMap = new LinkedHashMap<Integer,String>();

    //will this iterator iterate the keys in the order of the map (1, 2, 3, 4)? Or just random order?
    Iterator<Integer> itr = linkedHashMap.keySet().iterator();
    while(itr.hasNext()) {
        Integer key = itr.next();
        if (list.contains(key)) {
            selectedlinkedHashMap.put(key, linkedHashMap.get(key));
            System.out.println(key + ":" + linkedHashMap.get(key));
        }
    }
}
}

Приведенный выше код возвращает результат, который мне нравится. Но я не уверен, что это гарантировано.

1: "Один"

3: "Три"

Вопрос в том,: Итератор itr = linkedHashMap.набор ключей().итератор(); В приведенной выше строке появится итератор из множества и множества не упорядочен. Так вызовет ли это ключи в случайном порядке? если да, то я не могу сохранить исходный порядок (не гарантированный) моей карты после фильтрации.... Может ли кто-нибудь помочь мне с этим?

3   2   2012-06-14 22:45:00

3 ответа:

Итератор возвращается из keySet().функция iterator () должна возвращать упорядоченный набор. Документация из Map API :

The Map interface provides three collection views, which allow a map's contents to be 
viewed as a set of keys, collection of values, or set of key-value mappings. The order of 
a map is defined as the order in which the iterators on the map's collection views return   
their elements. Some map implementations, like the TreeMap class, make specific guarantees  
as to their order; others, like the HashMap class, do not.

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

Когда вы вызываете keySet(), это создает представление ключей на основе базовых данных. По общему признанию, это не очень четко документировано, но поскольку это является просто представлением, было бы невероятно странно, чтобы это представление повторялось в другом порядке.

Вы можете проверить реализацию, конечно, но я уверен, что это нормально.

А вы пробовали? Я не уверен, что он возвращает их в том же порядке, в каком они были вставлены, но в этом конкретном случае вы можете создать набор деревьев с полученным набором ключей, и поскольку они являются целыми числами, его порядок будет естественным. 1 и затем 3.

Вроде как:

Set<Integer> set = new TreeSet<Integer>(linkedHashMap.keySet());