2013-11-27 2 views
13

У меня есть эта Java Карта:Как получить позицию элемента из Java Карта

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

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

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

+0

увидеть это http://stackoverflow.com/questions/8502542/find-element-position-in-a-java-treemap –

ответ

20

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

Это очень приятное решение. – janakagamini

1

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

+0

Как этот? 'private static final Map cache = new ArrayList <>();'? –

+0

Нет, вы не можете назначить экземпляр ArrayList для Карты. 'List cache = new ArrayList ();' , но тогда вы можете только перебирать этот список и не можете получить значение по ключу. – Foolish

+0

Итак, какой пример должен быть подходящим? –

5

HashMap не имеет определенного упорядочения keys.It-х Unordered.

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

5

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

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

1

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

1

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

1

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

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

1

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

3

Согласно documentation, 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()); 
+0

Как я могу получить 6-й элемент карты 'private static final Map cache = new LinkedHashMap <>();'? –

2

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

Пример, как изменить код? –

+0

Это не работает, потому что у меня есть объект для второго значения: 'LinkedHashMap linkedHashMap = new LinkedHashMap ();' –

+0

@PeterPenzov Проверьте отредактированный ответ. Я думаю, это поможет вам. – Prateek

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

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

+0

@PeterPenzov проверить мое предложение. –

+0

Это не работает. –

1

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

Для кобыла подробно о LinkedHashMap см this

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

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

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

Хорошо, как я могу получить 6-й элемент из этого кода? 'private static final Map cache = new LinkedHashMap <>();'? –

+0

См. Отредактированный ответ – rachana

Смежные вопросы