2016-06-21 5 views
2

Можно ли получить список значений из HashMap в качестве эталонаПолучить значения из HashMap в качестве ссылки

class MyCustomObject { 
    String name; 
    Integer id; 

    MyCustomObject(String name, Integer id){ 
     this.name = name; 
     this.id = id; 
    } 
} 
HashMap<Integer, MyCustomObject> map = new LinkedHashMap<>(); 
map.put (1, new MyCustomObject("abc",1)); 
map.put (2, new MyCustomObject("xyz",2)); 

List<MyCustomObject> list = new ArrayList<>(map.values()); 

Log.i(TAG,"************ List from HashMap ************"); 
for (MyCustomObject s : list) { 
    Log.i(TAG,"name = "+s.name); 
} 

list.set(0,new MyCustomObject("temp",3)); 

Log.i(TAG,"************ List from HashMap after update ************"); 
for (MyCustomObject s : list) { 
     Log.i(TAG,"name = "+s.name); 
} 

Log.i(TAG,"************ List from HashMap ************"); 

List<MyCustomObject> list2 = new ArrayList<>(map.values()); 
for (MyCustomObject s : list2) { 
    Log.i(TAG,"name = "+s.name); 
} 

Выход

**************** List from HashMap *************** 
name = abc 
name = xyz 
**************** List from HashMap after update *************** 
name = temp 
name = xyz 
**************** List from HashMap *************** 
name = abc 
name = xyz 

Вот если получить список значений из HashMap возвращение товара не возможно.

Update

мое требование

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

Пожалуйста, скажите, если любая библиотека третьей стороны предоставлять такую ​​структуру данных, или, что было бы наилучший подход справиться с этой ситуацией

+2

'List list = new ArrayList <> (map.values ​​());' Как вы думаете, что делает эта строка? – Fildor

+0

Это мелкая копия, что именно вы хотите? – Boola

+0

Спойлер: https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList(java.util.Collection) – Fildor

ответ

2

Пробуйте использовать записи в карте, которые поддерживаются картой и которые вы получаете по телефону entrySet(). Список тех, кто работает почти так, как вы этого хотите (хотя я все равно буду защищать вас напрямую, используйте map.put(key, updatedValue).

Пример:

Map<String, Integer> map = new HashMap<>(); 
map.put("a", 1); 
map.put("b", 2); 

//you create a list that's not backed by the map here but that isn't a problem 
//since the list elements, i.e. the entries, are backed by the map 
List<Entry<String, Integer>> entryList = new ArrayList<>(map.entrySet()); 
entryList.get(0).setValue(5); 

System.out.println(map); //prints: {a=5, b=2} (note that order is a coincidence here) 

одно замечание, хотя: как я уже говорил в моем комментарии, когда дело с заказом карты не всегда детерминированным (если вы не знаете, что вы имеете дело с упорядоченным карты, как TreeMap) и, следовательно, использование индексов может приводить к ошибкам или нежелательному поведению. Вот почему вы хотите, по крайней мере, проверить ключ в большинстве случаев, и, следовательно, вам нужно либо использовать Map.Entry (который, кстати, не может изменить его ключ по уважительным причинам) или использовать ключ напрямую, в этом случае вы не используете нужен список/коллекция значений или записей.

+0

Это наиболее близко к тому, что мне нужно – penguin

+0

Будет ли заказ детерминированным, если я использую LinkedHashMap вместо HashMap? Будет ли map.entrySet() предоставлять данные в том же порядке всегда – penguin

+0

http://stackoverflow.com/questions/2923856/is-the-order-guaranteed-for-the-return-of-keys-and-values-from-a -linkedhashmap-o/2924143 # 2924143 – penguin

4

Вы создаете новый List на основе значений Map:

List<MyCustomObject> list = new ArrayList<>(map.values()); 

Это то, что создает копию значений Collection, и изменения в этом List не могут быть отражены в оригинале Map.

Если вы внесете изменения в Сборник, возвращенный map.values() напрямую (например, map.values().remove(new MyCustomObject("abc",1))), он будет отражен в содержании оригинала Map. Вы не смогли бы позвонить set на Collection, хотя, так как Collection не имеет этого метода.

2

значения Коллекция()

Возвращает вид сбора значений, содержащихся в этой карте. Коллекция опирается на карту, поэтому изменения в карте отражаются в коллекции и наоборот.

Поэтому используйте коллекцию и назначьте ей values(). Или entrySet().

+0

Именно то, что я предлагаю, то есть использовать 'entrySet()' вместе с 'entry.setValue (...)' для обновления этой записи. – Thomas

+0

@Thomas +1 от меня, entrySet больше используется там, чем значения, поскольку ключ часто играет определенную роль. –