У меня есть эта Карта Java:
Можете ли вы рассказать мне, как я могу получить 6-й элемент Карты?
private static final Map<String, Users> cache = new HashMap<>();
Это возможно? Или мне нужно использовать другую коллекцию Java?
У меня есть эта Карта Java:
Можете ли вы рассказать мне, как я могу получить 6-й элемент Карты?
private static final Map<String, Users> cache = new HashMap<>();
Это возможно? Или мне нужно использовать другую коллекцию Java?
Хотя немного поздно ответить. Но вариант состоит в том, чтобы использовать LinkedHashMap
: эта карта сохраняет порядок в соответствии с вставкой элементов, как и все предлагали. Тем не менее, в качестве предупреждения он имеет конструктор LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
, который создаст связанную карту хэша, порядок итерации которой является порядком, в котором его записи были последними accessed
. Не используйте этот конструктор для этого случая.
Однако, если мне нужна такая функциональность, я бы расширил ее и выполнил бы мою необходимую функцию, чтобы повторно использовать их в способе ООП.
class MyLinkedMap<K, V> extends LinkedHashMap<K, V>
{
public V getValue(int i)
{
Map.Entry<K, V>entry = this.getEntry(i);
if(entry == null) return null;
return entry.getValue();
}
public Map.Entry<K, V> getEntry(int i)
{
// check if negetive index provided
Set<Map.Entry<K,V>>entries = entrySet();
int j = 0;
for(Map.Entry<K, V>entry : entries)
if(j++ == i)return entry;
return null;
}
}
Теперь я могу создать экземпляр и получить запись и значение в любом случае:
MyLinkedMap<String, Integer>map = new MyLinkedMap<>();
map.put("a first", 1);
map.put("a second", 2);
map.put("a third", 3);
System.out.println(map.getValue(2));
System.out.println(map.getEntry(1));
Вывод:
3
a second=2
С guava Iterables
Iterables.get(map.entrySet(),6);
HashMap
не предоставляет заказ. Если вы относитесь к порядку, вы должны использовать LinkedHashMap
Map<String, Users> orderedMap=new LinkedHashMap<>();
Теперь, когда вы кладете элемент, он будет поддерживать порядок, который вы положили.
Если вы хотите получить 6-й элемент, теперь вы можете сделать это, так как у вас есть свои элементы в порядке.
orderedMap.values().toArray()[5]// will give you 6th value in the map.
Пример
Map<String, String> orderedMap=new LinkedHashMap<>();
orderedMap.put("a","a");
orderedMap.put("b","b");
System.out.println(orderedMap.values().toArray()[1]); // you will get b(value)
System.out.println(orderedMap.keySet().toArray()[1]); // you will get b(key)
}
HashMap
не имеет определенного порядка ключей. Он неупорядочен.
Вы можете использовать LinkedHashMap
, который будет хранить ваши ключи в порядке их установки. Вы можете получить их, вызвав keySet().
A HashMap
не поддерживает порядок вставленных в него элементов. Вместо этого вы можете использовать LinkedHashMap
, который поддерживает порядок вставленных в него элементов.
Хотя вам нужно заметить, что даже LinkedHashMap
не имеет такого метода, который бы дал элемент в конкретном индексе. Вам придется вручную перебирать записи и извлекать элемент на 6-й итерации.
В соответствии с документацией, HashMap является реализацией интерфейса карты на основе хэш-таблицы. Эта реализация обеспечивает все необязательные операции с картами и разрешает нулевые значения и нулевой ключ. (Класс HashMap примерно эквивалентен Hashtable, за исключением того, что он несинхронизирован и разрешает null.) Этот класс не дает никаких гарантий относительно порядка карты; в частности, он не гарантирует, что порядок будет оставаться постоянным с течением времени.
Вот почему нецелесообразно использовать такую коллекцию.
UPDATE:
Основываясь на реализации @Prateek LinkedHashMap, я бы предложил что-то вроде:
LinkedHashMap<String,User> linkedHashMap = new LinkedHashMap<String,User>();
// or LinkedHashMap<String,User> linkedHashMap = new LinkedHashMap<>(); //for java 7+
linkedHashMap.put("1",userObj1);
linkedHashMap.put("2",userObj2);
linkedHashMap.put("3",userObj3);
/* Get by position */
int pos = 1; // Your position
User tmp= (new ArrayList<User>(linkedHashMap.values())).get(pos);
System.out.println(tmp.getName());
HashMaps не сохранять порядок:
LinkedHashMap, который гарантирует предсказуемый порядок итерации.
Пример
public class Users
{
private String Id;
public String getId()
{
return Id;
}
public void setId(String id)
{
Id = id;
}
}
Users user;
LinkedHashMap<String,Users> linkedHashMap = new LinkedHashMap<String,Users>();
for (int i = 0; i < 3; i++)
{
user = new Users();
user.setId("value"+i);
linkedHashMap.put("key"+i,user);
}
/* Get by position */
int pos = 1;
Users value = (new ArrayList<Users>(linkedHashMap.values())).get(pos);
System.out.println(value.getId());
Правильно!! вам придется использовать другую коллекцию для получения значений по индексу (позиции). Вы можете использовать ArrayList
В HashMap
нет порядка. Вы можете получить список ключей с помощью map.keySet()
, но нет гарантии, что набор ключей будет в том порядке, в котором вы его добавили. Используйте LinkedHashMap
вместо HashMap
Он всегда будет возвращать ключи в том же порядке (как вставка )
A HashMap
не имеет позиции. Вы можете выполнить итерацию через KeySet
или EntrySet
, и выбрать n-й элемент, но это не так, как позиция. A LinkedHashMap имеет позицию, поскольку имеет предсказуемый порядок итерации.
Если упорядочение означает значимость, вы можете использовать SortedMap.
Конкретная реализация: TreeMap
Для того, чтобы указать порядок вставленных элементов, вам нужно использовать LinkedHashMap
. HashMap
не может этого сделать.
Использовать LinkedHashMap вместо HashMap Он будет возвращать ключи в том же порядке (как вставка) при вызове keySet().
Подробнее о LinkedHashMap см. this
Например, чтобы получить элемент из определенного индекса
Создайте новый список из ваших значений и получите значение на основе индекса.
LinkedHashMap<String, List<String>> hMap;
List<List<String>> l = new ArrayList<List<String>>(hMap.values());
l.get(6);