Получить ключ от 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) является динамическим и неизвестно. Поэтому ЭТОТ ЛИНИЯ - это не то, что я хочу.

Ответ 1

Спасибо @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();

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

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

Ответ 2

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

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

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

Ответ 3

Вы можете создать класс 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> (как дочерний объект)

Ответ 4

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

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

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

CHILD_NAME_DOB.get(key)

Обратите внимание, что Java HashMap не гарантирует порядок записей. Поэтому каждый раз, когда вы перебираете HashMap, записи появляются в разных позициях. Вам понадобится LinkedHashMap который гарантирует предсказуемый порядок итераций.

Ответ 5

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

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

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

Ответ 6

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

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"));
    }

}

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

Ответ 7

    for (String key : hmList.keySet()) {
        String value = hmList.get(key);

        Log.e("HashMap values", "key=" + key + " ,value=" + value);
    }

Ответ 8

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

ArrayMap.valueAt(index);

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

ArrayMap.keyAt(index);

Ответ 9

Этот способ получить ключ....

public static String getHashMapKeyFromIndex(HashMap hashMap, int index){

    String key = null;
    HashMap <String,Object> hs = hashMap;
    int pos=0;
    for(Map.Entry<String, Object> entry : hs.entrySet())
    {
        if(index==pos){
            key=entry.getKey();
        }
        pos++;
    }
    return key;

}