Получить ключ от HashMap в Android по позиции или индексу

У меня есть:

public static HashMap<String, String> CHILD_NAME_DOB = new HashMap<>(); 

Предположим, что значения в CHILD_NAME_DOB :

 <adam,15121990> <roy,01051995> <neha,05091992> <alisha,11051992> 

Я пытаюсь извлечь последний ключевой элемент из CHILD_NAME_DOB . То есть, я хочу извлечь ключевую alisha из приведенного выше примера в временное String name .

Также я хочу знать, как получить данные по индексу.

Например: if int index = 2 , я хочу, чтобы клавиша "Neha" в String name

ТИА.

Изменить: значение DateOfBirth (данные значения в CHILD_NAME_DOB ) является динамическим и неизвестно. Так что эта связь не то, что я хочу.

Solutions Collecting From Web of "Получить ключ от HashMap в Android по позиции или индексу"

Спасибо @ Pentium10 за этот ответ. И я немного изменил его в соответствии с моей потребностью.

 String key="default"; Iterator myVeryOwnIterator = CHILD_NAME_DOB.keySet().iterator(); while(myVeryOwnIterator.hasNext()) { key=(String)myVeryOwnIterator.next(); //String value=(String)meMap.get(key); } Toast.makeText(viewEnterChildExp.getContext(), "Key: "+key , Toast.LENGTH_LONG).show(); 

Я получаю последний ключевой элемент.

Я обновлю, как только я также получу, чтобы найти простой способ сделать ключ по индексу.

Получение «последней» клавиши и выборка по индексу не поддерживается HashMap . Вы можете использовать LinkedHashMap и искать элемент с индексом 2 (или последним элементом) путем итерации по нему. Но это будет операция O (n).

Я предлагаю вам использовать List<Pair<String, String>> если порядок ключей / значений важен для вас, и вы хотите выполнить поиск по индексу.

Если для вас важны поиск на основе ключевых слов и индексов, вы можете использовать объединенную структуру данных, состоящую как из List и из HashMap , но обратите внимание, что удаление элементов будет O(n) .

Вы можете создать класс Child

 public class Child(){ private String name; private String number; .... } 

А затем поместить этот объект в список

 public static List<Child> CHILD_NAME_DOB = new ArrayList<Child>(); // using LinkedList would defeat the purpose 

Таким образом вы можете вызвать метод get(int index) , который возвращает элемент в указанной позиции в этом списке.

В вашем примере

 <adam,15121990> <roy,01051995> <neha,05091992> <alisha,11051992> 

CHILD_NAME_DOB.get(2) вы получите <neha,05091992> (как <neha,05091992> объект)

HashMap нет концепции упорядочения, поэтому получение n-й записи не имеет смысла. Вместо этого вы можете использовать TreeMap , который упорядочен по его ключам.

Однако вы должны пересмотреть свою модель, поскольку у вас, похоже, конфликтующие интересы. С одной стороны, доступ по индексу типичен для Lists , тогда как доступ к ключу типичен для Maps . Я не уверен, в какой ситуации вы бы хотели сделать то и другое.

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

Я знаю, что это не лучшее решение, но как насчет этого решения (псевдокод!). Просто объедините список и карту в один класс.

 public class UserBirthday { private List<String> names = new ArrayList<>(); private Map<String, String> CHILD_NAME_DOB = new HashMap<String, String>(); public void add(String name, String bd) { if (!CHILD_NAME_DOB.containsKey(name)) { names.add(name); } CHILD_NAME_DOB.put(name, bd); } public String getByName(String name) { return CHILD_NAME_DOB.get(name); } public String getByIndex(int index) { return getByName(names.get(index)); // TODO: range test } public static void main(String[] args) { UserBirthday ub = new UserBirthday(); ub.add("dit", "12345678"); ub.add("lea", "234239423"); ub.add("alex", "43534534"); ub.add("ted", "099098790"); System.out.println(ub.getByIndex(2)); System.out.println(ub.getByName("alex")); } } 

У вас могут возникнуть проблемы, если вы удалите запись, но это должно быть просто предложение.

  for (String key : hmList.keySet()) { String value = hmList.get(key); Log.e("HashMap values", "key=" + key + " ,value=" + value); } 

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

 ArrayMap.valueAt(index); 

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

 ArrayMap.keyAt(index); 

Получить ключ по индексу из hashmap:

 key = (new ArrayList<>(CHILD_NAME_DOB.keySet())).get(index) 

Получить значение по индексу:

 CHILD_NAME_DOB.get(key)