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
はnullキーを許可します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
メソッドがあり、これは前の2つの問題に対処するのに役立ちます。
From 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のアルゴリズム」の例を使って理解を助けてください。
C#の '辞書'は '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#
Locationに値を設定します。
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();
}
}
MSDNのドキュメントで Hashtable クラスを調べてください。
キーのハッシュコードに基づいて編成されたキーと値のペアのコレクションを表します。
また、これはスレッドセーフではないことにも注意してください。
辞書を使用 - ハッシュテーブルを使用しますが、安全です。
また、あなたのJavaコードは
int a = map.get(key);
//continue with your logic
このようにC#でコーディングするのが最善です。
int a;
if(dict.TryGetValue(key, out a)){
//continue with your logic
}
こうすることで、ブロック内で変数 "a"の必要性を範囲指定することができ、後で必要になった場合でもブロック外でアクセスできます。
答えは
辞書
私の関数を見てください、その単純なaddはDictionaryの中で最も重要なメンバー関数を使います
リストに重複項目が含まれる場合、この関数は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
}
私はちょうど2セントをあげたかったのです。
これは@Powerlordの回答によるものです。
null文字列の代わりに "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");
}