добавление ключа в HashMap без значения?

#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/