C# Java HashMap 等效项

问题描述 投票:0回答:7

从 Java 世界进入 C# 世界,是否有一个 HashMap 等价物?如果没有你会推荐什么?

c# java hashmap
7个回答
670
投票

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
      允许空键
    • 如果您尝试添加空键,
    • .NET 的
      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 */ }

Dictionary
有一个
ContainsKey
方法可以帮助解决前两个问题。


41
投票

来自 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>

33
投票

我用“codaddict算法”的例子来帮助你理解

'C# 中的字典' 是平行宇宙中的'Hashmap 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 算法中观察到一个总体示例。

codaddict的Java算法:

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

8
投票

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

此外,您的 Java 代码

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

最好用 C# 编码:

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

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


6
投票

查看 MSDN 上有关 Hashtable 类的文档。

表示根据键的哈希码组织的键值对的集合。

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


0
投票

答案是

词典

看看我的函数,它简单的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
    }

0
投票

我只是想捐出我的两分钱。
这是根据@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");
}
© www.soinside.com 2019 - 2024. All rights reserved.