Как получить ключ и значение TreeMap по определенному индексу
У меня есть TreeMap с набором пар "ключ и значение". Как я могу получить ключ и значение в определенном индексе TreeMap?
РЕДАКТИРОВАТЬ: @TO-ALL: Спасибо. Но я знаю, как реализовать это, используя дополнительный ArrayList. Я просто подумал, есть ли способ достичь этого без использования дополнительного ArrayList.
6 ответов
Если вы действительно хотите использовать TreeMap и получить по позиции, вы можете использовать следующее:
key => treemap.keySet().toArray()[0]
value => treemap.get(key);
ИЛИ (если вы просто хотите значение)
treemap.values().toArray()[0];
Но я бы посоветовал вам использовать итератор, так как в приведенном выше методе он должен создавать массив всякий раз, когда вы хотите его найти (что не так эффективно), а также вы должны быть достаточно осторожны, чтобы убедиться, что индекс не выходит за пределы досягаемости.
Прежде всего, я не уверен, почему люди здесь так часто заботятся о обоснованности вопроса. Есть множество случаев, когда люди считали целесообразным поддерживать ArrayList в отсортированном порядке. Поддержание ArrayList в отсортированном порядке крайне неэффективно для больших списков.
Узлы ввода стандартного исходного кода Java (Oracle) не поддерживают размер своих деревьев-потомков. Из-за этого невозможно идентифицировать элемент на карте по индексу без неэффективного последовательного поиска.
Я нахожу этот недостаток настолько серьезным, что я написал свою собственную карту AVL, которая может эффективно получать элементы по индексу и вычислять indexOf(E). Сделать это возможно так же просто, как поддерживать размеры каждой из левой и правой веток записи. Есть некоторый шанс, что библиотека Glazedlists имеет где-то встроенное дерево поиска. Вы можете рассмотреть это.
Вы можете скопировать набор записей в список массивов и затем получить нужную запись по индексу:
list=new ArrayList<Map.Entry<K,V>>(treeMap.entrySet());
Map.Entry<K,V>=list.get(index);
Но а) копирование занимает O(N) времени и б) при изменении treeMap список становится недействительным.
Возможно, это не лучший способ, но вы сможете получить доступ к своему ключу / значению по определенному индексу.
TreeMap<Object, Object> foo = new TreeMap<Object, Object>();
Object key = foo.keySet().toArray(new Object[foo.size()])[YOUR_INDEX];
Object value = foo.get(key);
Это может быть полезно
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));
}
Вот другой вариант, чтобы получить ключ от значения:
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"