C#Java HashMap等价物
从一个Java世界到一个C#一个是否有一个HashMap的等价物? 如果不是,你会推荐什么?
Dictionary
可能是最接近的。 System.Collections.Generic.Dictionary
实现了System.Collections.Generic.IDictionary
接口(类似于Java的Map
接口)。
一些显着的差异,你应该知道的:
- 添加/获取项目
- Java的HashMap具有
put
和get
方法来设置/获取项目-
myMap.put(key, value)
-
MyObject value = myMap.get(key)
-
- C#的字典使用
[]
索引设置/获取项目-
myDictionary[key] = value
-
MyObject value = myDictionary[key]
-
- Java的HashMap具有
-
null
键- Java的
HashMap
允许空键 - 如果您尝试添加空键,.NET的
Dictionary
将引发ArgumentNullException
- Java的
- 添加一个重复的密钥
- Java的
HashMap
将用新的值代替现有的值。 - 如果使用
[]
索引,.NET的Dictionary
将会用新的replace现有的值。 如果你使用Add
方法,它会抛出一个ArgumentException
。
- Java的
- 尝试获取不存在的密钥
- Java的
HashMap
将返回null。 - .NET的
Dictionary
将抛出一个KeyNotFoundException
。 您可以使用TryGetValue
方法而不是[]
索引来避免这种情况:
MyObject value = null; if (!myDictionary.TryGetValue(key, value)) { /* key doesn't exist */ }
- Java的
Dictionary
有一个ContainsKey
方法,可以帮助处理前两个问题。
从C#等同于Java HashMap
我需要一个接受一个“空”键的字典,但似乎没有本地的,所以我写了我自己的。 实际上这很简单。 我从字典inheritance,添加一个专用字段来保存“空”键的值,然后覆盖索引器。 它是这样的:
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; } } } }
希望这有助于未来的人。
==========
我将其修改为这种格式
public class NullableDictionnary : Dictionary<string, object>
查看MSDN上Hashtable类的文档。
表示根据密钥的哈希码组织的键值对的集合。
另外请记住,这不是线程安全的。
让我通过一个“codaddict的algorithm”的例子来帮助你理解它
“C#中的字典 ”是并行Universe中的“Java中的Hashmap ”。
有些实现是不同的。 看下面的例子来更好地理解。
声明Java HashMap:
Map<Integer, Integer> pairs = new HashMap<Integer, Integer>();
声明C#字典:
Dictionary<int, int> Pairs = new Dictionary<int, int>();
从某个位置获取价值:
pairs.get(input[i]); // in Java Pairs[input[i]]; // in C#
在地点设置一个值:
pairs.put(k - input[i], input[i]); // in Java Pairs[k - input[i]] = input[i]; // in C#
从Codaddictalgorithm的下面可以看到一个整体例子。
Java中的codaddictalgorithm:
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); } }
C#中的Codaddictalgorithm
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(); } }
我想最好给个例子来说明一个最喜欢的..
所以检查这个集合,并决定你想要使用哪个集合。
答案是
字典
看看我的function,它的简单添加使用了Dictionary里面最重要的成员函数
如果列表包含Duplicates项目,则此函数返回false
public static bool HasDuplicates<T>(IList<T> items) { Dictionary<T, bool> mp = new Dictionary<T, bool>(); for (int i = 0; i < items.Count; i++) { if (mp.ContainsKey(items[i])) { return true; // has duplicates } mp.Add(items[i], true); } return false; // no duplicates }
我只是想给我两分钱。
这是根据@Powerlord的回答。
放置“空”而不是空string。
private static Dictionary<string, string> map = new Dictionary<string, string>(); public static void put(string key, string value) { if (value == null) value = "null"; map[key] = value; } public static string get(string key, string defaultValue) { try { return map[key]; } catch (KeyNotFoundException e) { return defaultValue; } } public static string get(string key) { return get(key, "null"); }