Tương đương với HashMap C # Java


325

Đến từ một thế giới Java thành một C # có tương đương HashMap không? Nếu không những gì bạn sẽ đề nghị?

Câu trả lời:


481

Dictionarycó lẽ là gần nhất System.Collections.Generic.Dictionarythực hiện System.Collections.Generic.IDictionarygiao diện (tương tự như Mapgiao diện của Java ).

Một số khác biệt đáng chú ý mà bạn cần lưu ý:

  • Thêm / Nhận vật phẩm
    • HashMap của Java có putgetcác phương thức để thiết lập / nhận các mục
      • myMap.put(key, value)
      • MyObject value = myMap.get(key)
    • Từ điển của C # sử dụng []lập chỉ mục để thiết lập / nhận các mục
      • myDictionary[key] = value
      • MyObject value = myDictionary[key]
  • null chìa khóa
    • Java HashMapcho phép các khóa null
    • .NET sẽ Dictionaryném ArgumentNullExceptionnếu bạn cố thêm khóa null
  • Thêm khóa trùng lặp
    • Java HashMapsẽ thay thế giá trị hiện tại bằng giá trị mới.
    • .NET Dictionarysẽ thay thế giá trị hiện tại bằng giá trị mới nếu bạn sử dụng []lập chỉ mục. Nếu bạn sử dụng Addphương thức, nó sẽ thay vào đó ArgumentException.
  • Cố gắng để có được một khóa không tồn tại
    • Java HashMapsẽ trả về null.
    • .NET Dictionarysẽ ném một KeyNotFoundException. Bạn có thể sử dụng TryGetValuephương pháp thay vì []lập chỉ mục để tránh điều này:
      MyObject value = null; if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }

DictionaryCó một ContainsKeyphương pháp có thể giúp giải quyết hai vấn đề trước đó.


9
Không có một tương đương chính xác (trong JAVA HashMap cho phép các giá trị null và khóa null) download.oracle.com/javase/1.4.2/docs/api/java/util/ù
Fabio Maulo

3
Vâng, từ điển gần nhưng không chính xác.
Powerlord

14
Lưu ý, Dictionaryném Ngoại lệ khi thêm khóa trùng lặp.
Rubens Mariuzzo

4
Ngoài ra, một Ngoại lệ được đưa ra khi yêu cầu một giá trị với khóa không tồn tại.
Rubens Mariuzzo

if (!myDictionary.TryGetValue(key, value))cần một outđối số thứ hai. Vì vậyif (!myDictionary.TryGetValue(key, out value))
bugybunny

38

Từ C # tương đương với Java HashMap

Tôi cần một cuốn Từ điển chấp nhận khóa "null", nhưng dường như không có từ gốc, vì vậy tôi đã tự viết. Thật ra nó rất đơn giản. Tôi đã kế thừa từ điển, thêm một trường riêng để giữ giá trị cho khóa "null", sau đó ghi đè lên bộ chỉ mục. Nó như thế này:

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

Mong rằng điều này sẽ giúp ai đó trong tương lai.

==========

Tôi đã sửa đổi nó sang định dạng này

public class NullableDictionnary : Dictionary<string, object>

6
Bạn không thể tiếp tục chủ đề chung chung bằng cách biến đối tượng thành một tham số loại?
colithium

Điều này không hoạt động. công khai StringDixi cái này [khóa chuỗi] {... nên là công khai Chuỗi này [khóa chuỗi] {. Ngoài ra, cơ sở [key] sẽ không hoạt động từ thử của tôi. Tôi đề nghị triển khai IDadata và chỉ cần có một đối tượng từ điển riêng toàn cầu và xử lý trường hợp null cho mỗi phương thức.
A.sharif

4
Tôi tự hỏi tại sao bạn đi ra khỏi từ điển sai chính tả.
Jim Balter

5
@JimBalter Rõ ràng anh ấy cần một cuốn từ điển.
Phillip Elm

17

Hãy để tôi giúp bạn hiểu về nó với một ví dụ về "thuật toán codaddict"

' Từ điển trong C #' là ' Hashmap trong Java' trong vũ trụ song song.

Một số thực hiện là khác nhau. Xem ví dụ dưới đây để hiểu rõ hơn.

Khai báo Java HashMap:

Map<Integer, Integer> pairs = new HashMap<Integer, Integer>();

Khai báo từ điển C #:

Dictionary<int, int> Pairs = new Dictionary<int, int>();

Lấy giá trị từ một vị trí:

pairs.get(input[i]); // in Java
Pairs[input[i]];     // in C#

Đặt giá trị tại vị trí:

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

Một ví dụ tổng thể có thể được quan sát từ bên dưới thuật toán của Codaddict.

thuật toán của codaddict trong 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);

    }
}

Thuật toán của Codaddict trong 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();
    }
}

Upvote cho câu trả lời tốt nhất, cảm ơn
ucMedia

5

Kiểm tra tài liệu về MSDN cho lớp Hashtable .

Đại diện cho một tập hợp các cặp khóa và giá trị được tổ chức dựa trên mã băm của khóa.

Ngoài ra, hãy nhớ rằng đây không phải là chủ đề an toàn.


21
Dictionary<TKey, TValue>tốt hơn là vì kiểm tra kiểu thời gian biên dịch và vì nó không yêu cầu quyền anh của các loại giá trị.
Thorarin

3

Sử dụng từ điển - nó sử dụng hashtable nhưng là loại an toàn.

Ngoài ra, mã Java của bạn cho

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

sẽ được mã hóa tốt nhất theo C # theo cách này:

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

Bằng cách này, bạn có thể phạm vi nhu cầu của biến "a" bên trong một khối và nó vẫn có thể truy cập được bên ngoài khối nếu bạn cần nó sau này.


0

câu trả lời là

Từ điển

hãy xem chức năng của tôi, phần bổ sung đơn giản của nó sử dụng hầu hết các hàm thành viên quan trọng bên trong Dictionary

Hàm này trả về false nếu danh sách chứa các mục trùng lặp

 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

Tôi chỉ muốn cho tôi hai xu.
Đây là theo câu trả lời của @Powerlord.

Đặt "null" thay vì chuỗi 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");
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.