#java #collections #guava
#java #Коллекции #гуава
Вопрос:
Есть ли способ добавить ключ в HashMap без добавления значения? Я знаю, это кажется странным, но у меня есть HashMap<String, ArrayList<Object>>
amd, и я хочу сначала иметь возможность создавать ключи по мере необходимости, а затем проверять, существует ли определенный ключ, и, если да, вводить соответствующее значение, а именно ArrayList<Object>
Это было достаточно запутанным?
Ответ №1:
Поскольку вы используете Map<String, List<Object>>
, вы действительно ищете multimap. Я настоятельно рекомендую использовать стороннюю библиотеку, такую как Google Guava, для этого — см. Guava Multimaps
.
Multimap<String, Object> myMultimap = ArrayListMultimap.create();
// fill it
myMultimap.put("hello", "hola");
myMultimap.put("hello", "buongiorno");
myMultimap.put("hello", "สวัสดี");
// retrieve
List<String> greetings = myMultimap.get("hello");
// ["hola", "buongiorno", "สวัสดี"]
Обновление Java 8: я больше не уверен, что каждый Map<K, SomeCollection<V>>
должен быть переписан как multimap. В наши дни довольно легко получить то, что вам нужно, без Guava, благодаря Map#computeIfAbsent()
.
Map<String, List<Object>> myMap = new HashMap<>();
// fill it
myMap.computeIfAbsent("hello", ignored -> new ArrayList<>())
.addAll(Arrays.asList("hola", "buongiorno", "สวัสดี");
// retrieve
List<String> greetings = myMap.get("hello");
// ["hola", "buongiorno", "สวัสดี"]
Ответ №2:
Я не уверен, что вы хотите это сделать. Вы можете сохранить ключ null
как значение для ключа, но если вы это сделаете, как вы сможете определить, когда вы выполняете .get("key")
, существует ли ключ или он существует, но со null
значением? В любом случае, смотрите документы.
Ответ №3:
Вы можете поместить null
значения. Это разрешено HashMap
Вы также можете сначала использовать Set
и проверить его на наличие ключа, а затем заполнить карту.
Комментарии:
1. …или просто используйте мультикарты Guava!
2. Привет, Божо — я нашел этот вопрос, потому что пытаюсь сделать что-то подобное, и ваш ответ действительно полезен. Не могли бы вы подробнее рассказать о том, как вы собираетесь инициализировать set, а затем преобразовать его в HashMap при добавлении в него объектов?
Ответ №4:
Да, это было достаточно запутанно 😉 Я не понимаю, почему вы хотите хранить ключи без значений, вместо этого просто помещая пустые списки массивов вместо null
.
Добавление null
может быть проблемой, потому что если вы вызываете
map.get("somekey");
и получите null
, тогда вы не знаете, не найден ли ключ или он присутствует, но сопоставляется с null
…
Комментарии:
1. Если вы добавите
null
, вы можете протестировать с помощью containsKey().2. @sarumont — конечно, но вы должны знать , что только этот метод работает для карты. Я был бы удивлен, если карта вернет
map.get("key") == null
иmap.contains("key") == true
…3. это работает с java.util. По крайней мере, HashMap.
map.put( "foo", null )
выдает true дляmap.containsKey( "foo" )
и null дляmap.get( "foo" )
4. @sarumont — конечно: и именно такое поведение удивило бы меня (в реальном коде) 😉
5. О, теперь я понимаю, что вы имели в виду. 🙂 Я бы тоже удивился, но не слишком сильно — к сожалению, я видел и похуже. 😉
Ответ №5:
//This program should answer your questions
import java.util.*;
public class attemptAddingtoHashMap { //Start of program
//MAIN METHOD #################################################
public static void main(String args[]) { //main begins
Map<String, ArrayList<Object>> hmTrial = new HashMap<String, ArrayList<Object>>();
ArrayList alTrial = new ArrayList();//No values now
if (hmTrial.containsKey("first")) {
hmTrial.put("first", alTrial); }
else {hmTrial.put("first",alTrial);}
//in either case, alTrial, an ArrayList was mapped to the string "first"
//if you choose to, you can also add objects to alTrial later
System.out.println("hmTrial is " hmTrial); //empty now
alTrial.add("h");
alTrial.add("e");
alTrial.add("l");
alTrial.add("l");
alTrial.add("o");
System.out.println("hmTrial is " hmTrial);//populated now
} //end of main
//#############################################################################################################
} //end of class
//Note - removing objects from alTrial will remove the from the hashmap
//You can copy, paste and run this code on https://ide.geeksforgeeks.org/