Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Varargs in Java HashMap

HashMap <String,String... strings> hm = new HashMap<String,String... strings>();

hm.put("Zara", "Pony","Cars", "Magic");
hm.put("John", "Horse","Flying", "Loving");

How can I do that? It's not letting me.

like image 617
calimses Avatar asked Mar 29 '18 07:03

calimses


2 Answers

The elipsis (...) operator can only be used in method signatures. You could explicitly declare and create arrays:

Map<String, String[]> hm = new HashMap<>();

hm.put("Zara", new String[]{"Pony", "Cars", "Magic"});
hm.put("John", new String[]{"Horse", "Flying", "Loving"});

If you absolutely must use varags, you can wrap the call to Map#put with your own method:

public static void main(String[] args) {
    Map<String, String[]> hm = new HashMap<>();

    addToMap(hm, "Zara", "Pony", "Cars", "Magic");
    addToMap(hm, "John", "Horse", "Flying", "Loving");
}

private static void addToMap
    (Map<String, String[]> map, String key, String... values) {
    map.put(key, values);
}
like image 143
Mureinik Avatar answered Oct 12 '22 07:10

Mureinik


Vararg notation is only for use with functions that allow it. It can not be used anywhere else.

You have to decide what you actually want your map values to be. Normally varargs is basically syntactic sugar for an array. However, a List or Set also makes sense here.

Either of the following would work:

  1. Array:

    HashMap <String, String[]> hm = new HashMap<>();
    hm.put("Zara", new String[] {"Pony","Cars", "Magic"});
    hm.put("John", new String[] {"Horse", "Flying", "Loving"});
    
  2. List:

    HashMap <String, List<String>> hm = new HashMap<>();
    hm.put("Zara", new ArrayList<String>());
    hm.get("Zara").add("Pony");
    hm.get("Zara").add("Cars");
    hm.get("Zara").add("Magic");
    hm.put("John", new ArrayList<String>());
    hm.get("John").add("Horse");
    hm.get("John").add("Flying");
    hm.get("John").add("Loving");
    
like image 2
Mad Physicist Avatar answered Oct 12 '22 07:10

Mad Physicist