C# to Java - Dictionaries?

C#JavaDictionaryMapNew Operator

C# Problem Overview


Is it possible in Java to make a Dictionary with the items already declared inside it? Just like the below C# code:

   Dictionary<string, int> d = new Dictionary<string, int>()
	{
	    {"cat", 2},
	    {"dog", 1},
	    {"llama", 0},
	    {"iguana", -1}
	};

How do I do this and what type do I use? I've read that Dictionary is obsolete.

C# Solutions


Solution 1 - C#

This will do what you want:

Map<String,Integer> map = new HashMap<String, Integer>(){{
    put("cat", 2);
    put("dog", 1);
    put("llama", 0);
    put("iguana", -1);
}};

This statement creates an anonymous subclass of HashMap, where the only difference from the parent class is that the 4 entries are added during instance creation. It's a fairly common idiom in the Java world (although some find it controversial because it creates a new class definition).

Because of this controversy, as of Java 9 there is a new idiom for conveniently constructing maps: the family of static Map.of methods.

With Java 9 or higher you can create the map you need as follows:

Map<String, Integer> map = Map.of(
    "cat", 2,
    "dog", 1,
    "llama", 0,
    "iguana", -1
);

With larger maps, this alternative syntax may be less error-prone:

Map<String, Integer> map = Map.ofEntries(
    Map.entry("cat", 2),
    Map.entry("dog", 1),
    Map.entry("llama", 0),
    Map.entry("iguana", -1)
);

(This is especially nice if Map.entry is statically imported instead of being referenced explicitly).

Besides only working with Java 9+, these new approaches are not quite equivalent to the previous one:

  • They don't allow you to specify what Map implementation is used
  • They only create immutable maps
  • They don't create an anonymous subclass of Map

However, these differences shouldn't matter for many use cases, making this a good default approach for newer versions of Java.

Solution 2 - C#

Map<String,Integer> map = new HashMap<String, Integer>(){{
put("cat", 2);
put("dog", 1);
put("llama", 0);
put("iguana", -1);
}};

Solution 3 - C#

Bite the bullet and type out the map name!

    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("cat", 2);
    map.put("dog", 1);
    map.put("llama", 0);
    map.put("iguana", -1);

You could also do something like this, which might save some typing with a long list:

    Object[][] values = {
        {"cat", 2},
        {"dog", 1},
        {"llama", 0},
        {"iguana", -1}
    };

    for (Object[] o : values) {
        map.put((String) o[0], (Integer) o[1]);
    }

Solution 4 - C#

If you use the Guava library, you can use its ImmutableMap class, either by itself (examples 1 and 2), or as an initializer for a HashMap (examples 3 and 4):

Map<String, Integer> map1 = ImmutableMap.<String, Integer> builder()
	.put("cat", 2)
	.put("dog", 1)
	.put("llama", 0)
	.put("iguana", -1)
	.build();
Map<String, Integer> map2 = ImmutableMap.of(
	"cat", 2,
	"dog", 1,
	"llama", 0,
	"iguana", -1
);
Map<String, Integer> map3 = Maps.newHashMap(
	ImmutableMap.<String, Integer> builder()
	.put("cat", 2)
	.put("dog", 1)
	.put("llama", 0)
	.put("iguana", -1)
	.build()
);
Map<String, Integer> map4 = Maps.newHashMap( ImmutableMap.of(
	"cat", 2,
	"dog", 1,
	"llama", 0,
	"iguana", -1)
);

Solution 5 - C#

Java7 almost introduced "collection literals" that would allow syntax like that. They'll probably try to shove it in Java8. I have no idea what is wrong with these people.

This can be easily achieved by some kind of wrapper API

Map<String,Integer> map = Maps.<String,Integer>empty()
    .put("cat", 2).put("dog",1)....; 

Not too bad. I would prefer something like

map("cat", "dog", ... )
.to(  1,     2,   ... );

This kind of thing must have been implemented by various people, unfortunately the standard API doesn't inculde such things.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionWildBamaBoyView Question on Stackoverflow
Solution 1 - C#Sean ReillyView Answer on Stackoverflow
Solution 2 - C#fireshadow52View Answer on Stackoverflow
Solution 3 - C#Luigi PlingeView Answer on Stackoverflow
Solution 4 - C#Sean Patrick FloydView Answer on Stackoverflow
Solution 5 - C#irreputableView Answer on Stackoverflow