C#Java HashMap相当


325

Javaの世界からC#の世界に来るのに相当するHashMapはありますか?そうでない場合、何をお勧めしますか?

回答:


481

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]
  • null キー
    • Java HashMapはnullキーを許可します
    • .NET は、nullキーを追加しようとするとDictionaryスローしArgumentNullExceptionます
  • 重複するキーを追加する
    • Java HashMapは既存の値を新しい値に置き換えます。
    • 索引付けDictionaryを使用すると、.NET は既存の値を新しい値に置き換えます[]Addメソッドを使用すると、代わりにがスローされますArgumentException
  • 存在しないキーを取得しようとしています
    • Java HashMapはnullを返します。
    • .NET DictionaryはをスローしKeyNotFoundExceptionます。これを回避するためTryGetValueに、[]インデックスの代わりにメソッドを使用できます。
      MyObject value = null; if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }

DictionaryContainsKeyは、前の2つの問題への対処に役立つ方法があります。


9
完全に同等(JAVAのHashMapにヌル値とヌルキーを許可)がないdownload.oracle.com/javase/1.4.2/docs/api/java/util/...
ファビオMaulo

3
はい、辞書は近いですが正確ではありません。
Powerlord 2010

14
Dictionary重複したキーを追加すると例外がスローされることに注意してください。
ルーベンスマリウッゾ2011

4
また、存在しないキーの値を要求すると、例外がスローされます。
ルーベンスマリウッゾ2011

if (!myDictionary.TryGetValue(key, value))out2番目の引数にはが必要です。だからif (!myDictionary.TryGetValue(key, out value))
バギーバニー

38

Java HashMapに相当するC#から

「null」キーを受け入れる辞書が必要でしたが、ネイティブなものはないようなので、自分で作成しました。実はとても簡単です。私はディクショナリから継承し、「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>

6
オブジェクトを型パラメーターにして、ジェネリックテーマを続けられませんか?
コロシアム2012年

これは機能しません。public StringDictionary this [string key] {...は、パブリックString this [string key] {である必要があります。また、base [key]は私の試みからは機能しません。IDictionaryを実装し、グローバルなプライベートディクショナリオブジェクトを用意して、各メソッドのnullケースを処理することをお勧めします。
A.sharif

4
どうして辞書のスペルを間違えたのかしら。
ジムバルター、2015

5
@JimBalter明らかに彼は辞書が必要です。
Phillip Elm

17

「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#

場所に値を設定:

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

5

Hashtableクラスについては、MSDNのドキュメントを確認してください。

キーのハッシュコードに基づいて編成されたキーと値のペアのコレクションを表します。

また、これはスレッドセーフではないことに注意してください。


22
Dictionary<TKey, TValue>コンパイル時の型チェックと、値型のボックス化が不要なため、推奨されます。
トラリン

3

辞書を使用-ハッシュテーブルを使用しますが、タイプセーフです。

また、Javaコード

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

このようにC#でコーディングするのが最適です:

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

このようにして、ブロック内の変数 "a"の必要性をスコープすることができ、後で必要になった場合でも、ブロックの外部からアクセスできます。


0

答えは

辞書

私の関数を見てください、その単純な追加は辞書内の最も重要なメンバー関数を使用します

この関数は、リストに重複項目が含まれている場合は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
    }

0

私はちょうど私の2セントを与えたかったです。
これは@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");
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.