簡體   English   中英

C# Java HashMap 等價物

[英]C# Java HashMap equivalent

從 Java 世界進入 C# 世界是否有 HashMap 等價物? 如果不是,你會推薦什么?

Dictionary可能是最接近的。 System.Collections.Generic.Dictionary實現了System.Collections.Generic.IDictionary接口(類似於 Java 的Map接口)。

您應該注意的一些顯着差異:

  • 添加/獲取項目
    • Java 的 HashMap 具有用於設置/獲取項目的putget方法
      • myMap.put(key, value)
      • MyObject value = myMap.get(key)
    • C# 的 Dictionary 使用[]索引來設置/獲取項目
      • myDictionary[key] = value
      • MyObject value = myDictionary[key]
  • null
    • Java 的HashMap允許空鍵
    • 如果您嘗試添加空鍵,.NET 的Dictionary會拋出ArgumentNullException
  • 添加重復鍵
    • Java 的HashMap將用新值替換現有值。
    • 如果您使用[]索引,.NET 的Dictionary將用新值替換現有值。 如果您使用Add方法,它將改為拋出ArgumentException
  • 嘗試獲取不存在的密鑰
    • Java 的HashMap將返回 null。
    • .NET 的Dictionary將拋出KeyNotFoundException 您可以使用TryGetValue方法而不是[]索引來避免這種情況:
      MyObject value = null; if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }

DictionaryContainsKey方法可以幫助處理前兩個問題。

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 中的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”的需要限定在一個塊內,並且如果您以后需要它,它仍然可以在塊外訪問。

查看 MSDN 上有關Hashtable類的文檔。

表示基於鍵的哈希碼組織的鍵值對的集合。

另外,請記住,這不是線程安全的。

答案是

字典

看看我的函數,它的簡單添加使用了字典中最重要的成員函數

如果列表包含重復項,此函數返回 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM