C# Java HashMap equivalent
Solution 1
Dictionary
is probably the closest. System.Collections.Generic.Dictionary
implements the System.Collections.Generic.IDictionary
interface (which is similar to Java's Map
interface).
Some notable differences that you should be aware of:
- Adding/Getting items
- Java's HashMap has the
put
andget
methods for setting/getting itemsmyMap.put(key, value)
MyObject value = myMap.get(key)
- C#'s Dictionary uses
[]
indexing for setting/getting itemsmyDictionary[key] = value
MyObject value = myDictionary[key]
- Java's HashMap has the
-
null
keys- Java's
HashMap
allows null keys - .NET's
Dictionary
throws anArgumentNullException
if you try to add a null key
- Java's
- Adding a duplicate key
- Java's
HashMap
will replace the existing value with the new one. - .NET's
Dictionary
will replace the existing value with the new one if you use[]
indexing. If you use theAdd
method, it will instead throw anArgumentException
.
- Java's
- Attempting to get a non-existent key
- Java's
HashMap
will return null. - .NET's
Dictionary
will throw aKeyNotFoundException
. You can use theTryGetValue
method instead of the[]
indexing to avoid this:
MyObject value = null; if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }
- Java's
Dictionary
's has a ContainsKey
method that can help deal with the previous two problems.
Solution 2
From C# equivalent to Java HashMap
I needed a Dictionary which accepted a "null" key, but there seems to be no native one, so I have written my own. It's very simple, actually. I inherited from Dictionary, added a private field to hold the value for the "null" key, then overwritten the indexer. It goes like this :
public class NullableDictionnary : Dictionary<string, string>
{
string null_value;
public StringDictionary this[string key]
{
get
{
if (key == null)
{
return null_value;
}
return base[key];
}
set
{
if (key == null)
{
null_value = value;
}
else
{
base[key] = value;
}
}
}
}
Hope this helps someone in the future.
==========
I modified it to this format
public class NullableDictionnary : Dictionary<string, object>
Solution 3
Let me help you understand it with an example of "codaddict's algorithm"
'Dictionary in C#' is 'Hashmap in Java' in parallel universe.
Some implementations are different. See the example below to understand better.
Declaring Java HashMap:
Map<Integer, Integer> pairs = new HashMap<Integer, Integer>();
Declaring C# Dictionary:
Dictionary<int, int> Pairs = new Dictionary<int, int>();
Getting a value from a location:
pairs.get(input[i]); // in Java
Pairs[input[i]]; // in C#
Setting a value at location:
pairs.put(k - input[i], input[i]); // in Java
Pairs[k - input[i]] = input[i]; // in C#
An Overall Example can be observed from below Codaddict's algorithm.
codaddict's algorithm in Java:
import java.util.HashMap;
public class ArrayPairSum {
public static void printSumPairs(int[] input, int k)
{
Map<Integer, Integer> pairs = new HashMap<Integer, Integer>();
for (int i = 0; i < input.length; i++)
{
if (pairs.containsKey(input[i]))
System.out.println(input[i] + ", " + pairs.get(input[i]));
else
pairs.put(k - input[i], input[i]);
}
}
public static void main(String[] args)
{
int[] a = { 2, 45, 7, 3, 5, 1, 8, 9 };
printSumPairs(a, 10);
}
}
Codaddict's algorithm in C#
using System;
using System.Collections.Generic;
class Program
{
static void checkPairs(int[] input, int k)
{
Dictionary<int, int> Pairs = new Dictionary<int, int>();
for (int i = 0; i < input.Length; i++)
{
if (Pairs.ContainsKey(input[i]))
{
Console.WriteLine(input[i] + ", " + Pairs[input[i]]);
}
else
{
Pairs[k - input[i]] = input[i];
}
}
}
static void Main(string[] args)
{
int[] a = { 2, 45, 7, 3, 5, 1, 8, 9 };
//method : codaddict's algorithm : O(n)
checkPairs(a, 10);
Console.Read();
}
}
Solution 4
Check out the documentation on MSDN for the Hashtable class.
Represents a collection of key-and-value pairs that are organized based on the hash code of the key.
Also, keep in mind that this is not thread-safe.
Solution 5
Use Dictionary - it uses hashtable but is typesafe.
Also, your Java code for
int a = map.get(key);
//continue with your logic
will be best coded in C# this way:
int a;
if(dict.TryGetValue(key, out a)){
//continue with your logic
}
This way, you can scope the need of variable "a" inside a block and it is still accessible outside the block if you need it later.
John
Updated on March 03, 2021Comments
-
John over 3 years
Coming from a Java world into a C# one is there a HashMap equivalent? If not what would you recommend?
-
Fabio Maulo over 13 yearsThere isn't an exact equivalent (in JAVA HashMap permits null values and the null key) download.oracle.com/javase/1.4.2/docs/api/java/util/…
-
Powerlord over 13 yearsYes, Dictionary is close but not exact.
-
Rubens Mariuzzo over 12 yearsNote,
Dictionary
throws Exceptions when adding a duplicated key. -
Rubens Mariuzzo over 12 yearsAlso, an Exception is thrown when requesting a value with a non existing key.
-
colithium over 12 yearsCouldn't you continue the generics theme by making object a type parameter?
-
A.sharif about 9 yearsThis doesn't work. public StringDictionary this[string key] {... should be public String this[string key] {. Also base[key] won't work from my try. I suggest implementing IDictionary and just having a global private dictionary object and handling the null case for each of the methods.
-
Jim Balter almost 9 yearsI wonder why you went out of your way to misspell Dictionary.
-
Phillip Elm over 7 years@JimBalter Clearly he needs a dictionary.
-
bugybunny over 5 years
if (!myDictionary.TryGetValue(key, value))
needs anout
for the second argument. Soif (!myDictionary.TryGetValue(key, out value))
-
Powerlord over 5 years@bugybunny Good catch. This is why you should always test code when putting it into answers... and I clearly didn't.
-
Wizou almost 5 yearsNote that if
TryGetValue
returns false, it also setsvalue
todefault
for its type (typically 0 or null, which would be similar to whatHashMap
returns). So if you're happy with that, in some case you don't even need to check the boolean result ofTryGetValue
-
nevvermind over 3 years
dict.TryGetValue(key, out int a)
since C# 7.0. -
dimitar.bogdanov about 3 yearsC#9.0 comment: you can use
new()
if you know the type of a variable, instead of typing outnew Dictionary<int, int>()
for example. :) (this answer was posted way before C#9.0 but readers using this code are advised to write more readable code)