等价于c# Java HashMap

从Java世界到c#世界,有没有HashMap的对等物?如果没有,你推荐什么?

545615 次浏览

Dictionary可能是最接近的。System.Collections.Generic.Dictionary实现了System.Collections.Generic.IDictionary接口(类似于Java的Map接口)。

你应该注意的一些显著差异:

    <李>添加/项目
      Java的HashMap有putget方法用于设置/获取项
      • myMap.put(key, value)
      • MyObject value = myMap.get(key)
      • 李< / ul > < / > c#的字典使用[]索引来设置/获取项
        • myDictionary[key] = value
        • MyObject value = myDictionary[key]
        • 李< / ul > < / > 李< / ul > < / > <李> null钥匙
          • Java的HashMap允许空键
          • 如果你试图添加一个空键,.NET的Dictionary抛出一个ArgumentNullException
          • 李< / ul > < / >
          • 添加重复密钥
            • Java的HashMap将用新值替换现有值。
            • 如果使用[]索引,. net的Dictionary将用新值替换现有值。如果你使用Add方法,它会抛出一个ArgumentException
            • 李< / ul > < / >
            • 试图获取一个不存在的密钥
              • Java的HashMap将返回null。
              • <李>。NET的Dictionary将抛出一个KeyNotFoundException。你可以使用TryGetValue方法代替[]索引来避免这种情况:
                MyObject值= null; 如果(! myDictionary。TryGetValue(key, out value)) {/* key不存在*/} . 李< / ul > < / >

              Dictionary's有一个ContainsKey方法,可以帮助处理前两个问题。

查看MSDN上哈希表类的文档。

表示基于键的哈希代码组织的键和值对的集合。

另外,请记住,这不是线程安全的。

c#等价于Java HashMap

我需要一个接受“null”键的字典,但似乎没有原生的字典,所以我自己写了一个。其实很简单。我继承了Dictionary,添加了一个私有字段来保存“null”键的值,然后重写了索引器。它是这样的:

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>

让我用一个"codaddict's algorithm"的例子来帮助你们理解

字典< em > < / em > in c#”在平行宇宙中是“< em > Hashmap < / em > in Java”。

有些实现是不同的。请参阅下面的示例以更好地理解。

声明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#

从Codaddict的算法下面可以观察到一个整体示例。

Java中的codaddict算法:

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的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();
}
}

答案是

字典

看看我的函数,它的简单添加使用了字典中最重要的成员函数

如果列表中包含duplicate项,则此函数返回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的回答。

放置“零”而不是字符串。

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");
}

使用字典-它使用哈希表,但类型安全。

的Java代码

int a = map.get(key);
//continue with your logic

最好是这样用c#编写的:

int a;
if(dict.TryGetValue(key, out a)){
//continue with your logic
}

通过这种方式,您可以在块内确定变量“a”的需求,并且如果稍后需要它,它仍然可以在块外访问。