Подтвердить что ты не робот

Как получить позицию элемента из Java-карты

У меня есть эта Карта Java:

Можете ли вы рассказать мне, как я могу получить 6-й элемент Карты?

private static final Map<String, Users> cache = new HashMap<>();

Это возможно? Или мне нужно использовать другую коллекцию Java?

4b9b3361

Ответ 1

Хотя немного поздно ответить. Но вариант состоит в том, чтобы использовать 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

Ответ 2

С guava Iterables

Iterables.get(map.entrySet(),6);

Ответ 3

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

Ответ 4

HashMap не имеет определенного порядка ключей. Он неупорядочен.

Вы можете использовать LinkedHashMap, который будет хранить ваши ключи в порядке их установки. Вы можете получить их, вызвав keySet().

Ответ 5

A HashMap не поддерживает порядок вставленных в него элементов. Вместо этого вы можете использовать LinkedHashMap, который поддерживает порядок вставленных в него элементов.

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

Ответ 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());

Ответ 7

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());

Ответ 8

Правильно!! вам придется использовать другую коллекцию для получения значений по индексу (позиции). Вы можете использовать ArrayList

Ответ 9

В HashMap нет порядка. Вы можете получить список ключей с помощью map.keySet(), но нет гарантии, что набор ключей будет в том порядке, в котором вы его добавили. Используйте LinkedHashMap вместо HashMap Он всегда будет возвращать ключи в том же порядке (как вставка )

Ответ 10

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

Ответ 11

Если упорядочение означает значимость, вы можете использовать SortedMap.

Конкретная реализация: TreeMap

Ответ 12

Для того, чтобы указать порядок вставленных элементов, вам нужно использовать LinkedHashMap. HashMap не может этого сделать.

Ответ 13

Использовать LinkedHashMap вместо HashMap Он будет возвращать ключи в том же порядке (как вставка) при вызове keySet().

Подробнее о LinkedHashMap см. this

Например, чтобы получить элемент из определенного индекса

Создайте новый список из ваших значений и получите значение на основе индекса.

 LinkedHashMap<String, List<String>> hMap;
 List<List<String>> l = new ArrayList<List<String>>(hMap.values());
 l.get(6);