Подтвердить что ты не робот

Как получить ключ и значение TreeMap по конкретному индексу

У меня есть TreeMap с набором пар "Key and Value". Как я могу получить как ключ, так и значение в определенном индексе TreeMap?

EDIT: @TO-ALL: Спасибо. Но я знаю, как реализовать его, используя дополнительный ArrayList. Я просто подумал, что есть какой-либо способ достичь этого, не используя дополнительный ArrayList.

4b9b3361

Ответ 1

Если вы действительно хотите использовать TreeMap и получить по позиции, вы можете использовать следующее:

key => treemap.keySet().toArray()[0]
value => treemap.get(key); 

ИЛИ (если вам просто нужно значение)

treemap.values().toArray()[0]; 

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

Ответ 2

Во-первых, я не уверен, почему люди здесь так часто заботятся о действительности вопроса. Существует множество случаев, когда люди сочли нужным поддерживать ArrayList в отсортированном порядке. Сохранение ArrayList в отсортированном порядке крайне неэффективно для больших списков.

Входящие узлы стандартного дистрибутива Java (Oracle) не поддерживают размер их деревьев-потомков. Из-за этого невозможно идентифицировать элемент внутри карты по индексу без неэффективного последовательного поиска.

Я считаю этот недостаток настолько серьезным, что я написал свою собственную AVL-карту, которая может эффективно получать элементы по индексу и вычислять indexOf (E). Сделать это возможно так же просто, как поддерживать размеры каждой из левых и правых ветвей входа. Существует некоторая вероятность того, что в библиотеке Glazedlists есть дерево с возможностью поиска, встроенное в него где-то. Вы можете рассмотреть это.

Ответ 3

Вы можете скопировать набор записей в список массивов, а затем получить желаемую запись по индексу:

list=new ArrayList<Map.Entry<K,V>>(treeMap.entrySet());
Map.Entry<K,V>=list.get(index);

Но a) копирование занимает время O (N) и b) при изменении treeMap список становится недействительным.

Ответ 4

Это может быть не самый лучший способ, но вы сможете получить доступ к вашему ключу/значению в определенном индексе.

TreeMap<Object, Object> foo = new TreeMap<Object, Object>();
Object key = foo.keySet().toArray(new Object[foo.size()])[YOUR_INDEX];
Object value = foo.get(key);

Ответ 5

Это может быть полезно

TreeMap< String,Integer > ht=new TreeMap<>();

ht.put("12",1);
ht.put("22",2);
ht.put("32",3);
ht.put("42",4);
for(int i=0;i<ht.size();i++)
{
   System.out.println(new Vector(ht.keySet()).get(i));
   System.out.println(new Vector(ht.values()).get(i));
}

Ответ 6

вот еще один способ получить ключ от значения:

Map<String, String> map = new HashMap<String, String>();
map.put("s1", "s1Val");
map.put("s2", "s2Val");
map.put("s3", "s3Val");

    // ex: "s2Val" -> return "s2"

int index = new ArrayList<String>(map.values()).indexOf("s2Val");
System.out.println(map.keySet().toArray()[index]); // -> return "s2"