[英]C# Java HashMap equivalent
從 Java 世界進入 C# 世界是否有 HashMap 等價物? 如果不是,你會推薦什么?
Dictionary
可能是最接近的。 System.Collections.Generic.Dictionary
實現了System.Collections.Generic.IDictionary
接口(類似於 Java 的Map
接口)。
您應該注意的一些顯着差異:
put
和get
方法
myMap.put(key, value)
MyObject value = myMap.get(key)
[]
索引來設置/獲取項目
myDictionary[key] = value
MyObject value = myDictionary[key]
null
鍵
HashMap
允許空鍵Dictionary
會拋出ArgumentNullException
HashMap
將用新值替換現有值。[]
索引,.NET 的Dictionary
將用新值替換現有值。 如果您使用Add
方法,它將改為拋出ArgumentException
。HashMap
將返回 null。Dictionary
將拋出KeyNotFoundException
。 您可以使用TryGetValue
方法而不是[]
索引來避免這種情況:MyObject value = null; if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }
Dictionary
的ContainsKey
方法可以幫助處理前兩個問題。
我需要一個接受“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算法”的例子來幫助你理解它
'C# 中的字典'是平行宇宙中的'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#
從下面的 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);
}
}
C# 中的 Codaddict 算法
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();
}
}
使用字典 - 它使用哈希表,但類型安全。
此外,您的 Java 代碼
int a = map.get(key);
//continue with your logic
最好這樣用 C# 編碼:
int a;
if(dict.TryGetValue(key, out a)){
//continue with your logic
}
這樣,您可以將變量“a”的需要限定在一個塊內,並且如果您以后需要它,它仍然可以在塊外訪問。
答案是
字典
看看我的函數,它的簡單添加使用了字典中最重要的成員函數
如果列表包含重復項,此函數返回 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 的回答。
放置“null”而不是空字符串。
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");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.