2012-06-22 3 views
14

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

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

+2

Почему вы хотите сделать это? Индексы являются внутренними для реализации TreeMap. Вы не должны их использовать. Вы всегда должны полагаться только на методы 'keys()', 'values ​​()' и 'get (key)'. –

+1

Это совершенно преднамеренно, что вы не можете этого сделать, за исключением того, что просто перебираете «entrySet» в линейном времени. –

+0

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

ответ

2

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

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

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

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

ИЛИ (если вы просто хотите значение)

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

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

+0

Я создаю этот массив только один раз при запуске, а затем сохраняю его как таблицу поиска.Кроме того, вот пример получения типированного массива 'myMap.keySet(). ToArray (новый Integer [0]);' Спасибо! – gnB

3

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

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

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

5

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

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

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

-2

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

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" 
+0

, не связанный с вопросом, который задал ОП. Кроме того, «Карта» не гарантирует заказ – frugalcoder

0

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

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)); 
} 
Смежные вопросы