Получить ключ от 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;
}