Как получить ключ и значение TreeMap по конкретному индексу
У меня есть TreeMap с набором пар "Key and Value". Как я могу получить как ключ, так и значение в определенном индексе TreeMap?
EDIT: @TO-ALL: Спасибо. Но я знаю, как реализовать его, используя дополнительный ArrayList. Я просто подумал, что есть какой-либо способ достичь этого, не используя дополнительный ArrayList.
Ответы
Ответ 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"