C# Java HashMap equivalent
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.
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>
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 JavaPairs[input[i]]; // in C#
Setting a value at location:
pairs.put(k - input[i], input[i]); // in JavaPairs[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(); }}