C#Java HashMap等价

Joh*_*ohn 303 c# java hashmap

从Java世界变成C#,有一个HashMap等价物吗?如果不是你会推荐什么?

Pow*_*ord 452

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允许使用null键
    • 如果您尝试添加null键,.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方法可以帮助解决前两个问题.

  • 注意,`Dictionary`在添加重复键时会抛出异常. (13认同)
  • 没有确切的等价物(在JAVA HashMap中允许空值和空键)http://download.oracle.com/javase/1.4.2/docs/api/java/util/HashMap.html (8认同)
  • 此外,在请求具有非现有键的值时会抛出异常. (4认同)
  • 是的,字典很接近但不准确. (3认同)
  • 请注意,如果“TryGetValue”返回 false,它也会将“value”设置为其类型的“default”(通常为 0 或 null,这与“HashMap”返回的内容类似)。因此,如果您对此感到满意,在某些情况下您甚至不需要检查 `TryGetValue` 的布尔结果 (3认同)

小智 36

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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助将来的某个人.

==========

我把它修改为这种格式

public class NullableDictionnary : Dictionary<string, object>
Run Code Online (Sandbox Code Playgroud)

  • 难道你不能通过使对象成为类型参数来继续泛型主题吗? (5认同)
  • @JimBalter显然他需要一本字典. (5认同)
  • 我想知道你为什么要出错拼写字典. (4认同)

Aja*_*iki 15

让我通过"codaddict算法"的例子来帮助你理解它

" C#中的字典 "是并行Universe中的"Java中的Hashmap ".

一些实现是不同的.请参阅下面的示例以更好地了解.

声明Java HashMap:

Map<Integer, Integer> pairs = new HashMap<Integer, Integer>();
Run Code Online (Sandbox Code Playgroud)

声明C#字典:

Dictionary<int, int> Pairs = new Dictionary<int, int>();
Run Code Online (Sandbox Code Playgroud)

从某个位置获取值:

pairs.get(input[i]); // in Java
Pairs[input[i]];     // in C#
Run Code Online (Sandbox Code Playgroud)

在位置设置值:

pairs.put(k - input[i], input[i]); // in Java
Pairs[k - input[i]] = input[i];    // in C#
Run Code Online (Sandbox Code Playgroud)

从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);

    }
}
Run Code Online (Sandbox Code Playgroud)

Codaddict在C#中的算法

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • C#9.0 注释:如果您知道变量的类型,则可以使用“new()”,而不是键入“new Dictionary&lt;int, int&gt;()”等。:)(这个答案是在 C#9.0 之前发布的,但建议使用此代码的读者编写更具可读性的代码) (4认同)

小智 8

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

另外,您的 Java 代码

int a = map.get(key);
//continue with your logic
Run Code Online (Sandbox Code Playgroud)

最好用 C# 编码,如下所示:

int a;
if(dict.TryGetValue(key, out a)){
//continue with your logic
}
Run Code Online (Sandbox Code Playgroud)

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

  • 从 C# 7.0 开始,`dict.TryGetValue(key, out int a)`。 (3认同)

Ray*_*Ray 5

查看有关Hashtable类的MSDN文档.

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

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

  • `Dictionary <TKey,TValue>`更好,因为编译时类型检查,因为它不需要装箱值类型. (21认同)