Setara dengan C # Java HashMap

326

Datang dari dunia Java ke C # one apakah ada HashMap yang setara? Jika tidak, apa yang akan Anda rekomendasikan?

John
sumber

Jawaban:

482

Dictionarymungkin yang terdekat. System.Collections.Generic.Dictionarymengimplementasikan System.Collections.Generic.IDictionaryantarmuka (yang mirip dengan Mapantarmuka Java ).

Beberapa perbedaan penting yang harus Anda perhatikan:

  • Menambah / Mendapatkan item
    • HashMap Java memiliki putdan getmetode untuk mengatur / mendapatkan item
      • myMap.put(key, value)
      • MyObject value = myMap.get(key)
    • Kamus C # menggunakan []pengindeksan untuk mengatur / mendapatkan item
      • myDictionary[key] = value
      • MyObject value = myDictionary[key]
  • null kunci
    • Java HashMapmemungkinkan kunci nol
    • .NET's Dictionarymelempar ArgumentNullExceptionjika Anda mencoba menambahkan kunci nol
  • Menambahkan kunci duplikat
    • Java HashMapakan menggantikan nilai yang ada dengan yang baru.
    • .NET Dictionaryakan mengganti nilai yang ada dengan yang baru jika Anda menggunakan []pengindeksan. Jika Anda menggunakan Addmetode ini, ia akan membuang ArgumentException.
  • Mencoba mendapatkan kunci yang tidak ada
    • Java HashMapakan mengembalikan nol.
    • .NET Dictionaryakan melempar KeyNotFoundException. Anda dapat menggunakan TryGetValuemetode alih-alih []pengindeksan untuk menghindari ini:
      MyObject value = null; if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }

DictionaryAda ContainsKeymetode yang dapat membantu menangani dua masalah sebelumnya.

Powerlord
sumber
9
Tidak ada yang setara tepat (di JAWA HashMap memungkinkan nilai-nilai null dan tombol nol) download.oracle.com/javase/1.4.2/docs/api/java/util/...
Fabio Maulo
3
Ya, Kamus dekat tetapi tidak tepat.
Powerlord
14
Catatan, Dictionarylempar Pengecualian saat menambahkan kunci duplikat.
Rubens Mariuzzo
4
Juga, Pengecualian dilemparkan ketika meminta nilai dengan kunci yang tidak ada.
Rubens Mariuzzo
if (!myDictionary.TryGetValue(key, value))membutuhkan outargumen kedua. Jadiif (!myDictionary.TryGetValue(key, out value))
bugybunny
38

Dari C # setara dengan Java HashMap

Saya membutuhkan Kamus yang menerima kunci "null", tetapi sepertinya tidak ada yang asli, jadi saya telah menulis sendiri. Sebenarnya sangat sederhana. Saya mewarisi dari Kamus, menambahkan bidang pribadi untuk menyimpan nilai untuk kunci "null", kemudian menimpa pengindeks. Bunyinya seperti ini:

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

Semoga ini bisa membantu seseorang di masa depan.

==========

Saya memodifikasinya ke format ini

public class NullableDictionnary : Dictionary<string, object>
KeithC
sumber
6
Tidak bisakah Anda melanjutkan tema generik dengan membuat objek sebagai parameter tipe?
colithium
Ini tidak berfungsi. StringDictionary publik ini [kunci string] {... harus public String ini [kunci string] {. Juga mendasarkan [kunci] tidak akan berhasil dari percobaan saya. Saya sarankan menerapkan IDictionary dan hanya memiliki objek kamus pribadi global dan menangani kasus nol untuk masing-masing metode.
A.sharif
4
Saya bertanya-tanya mengapa Anda pergi keluar dari cara untuk salah mengeja Kamus.
Jim Balter
5
@ JimBalter Jelas dia membutuhkan kamus.
Phillip Elm
17

Biarkan saya membantu Anda memahaminya dengan contoh "algoritma codaddict"

' Kamus dalam C #' adalah ' Hashmap in Java' dalam paralel paralel.

Beberapa implementasi berbeda. Lihat contoh di bawah ini untuk memahami lebih baik.

Mendeklarasikan Java HashMap:

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

Mendeklarasikan Kamus C #:

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

Mendapatkan nilai dari lokasi:

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

Menetapkan nilai di lokasi:

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

Contoh Keseluruhan dapat diamati dari algoritma Codaddict di bawah ini.

algoritma codaddict di Jawa:

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

    }
}

Algoritma Codaddict dalam 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();
    }
}
Ajay Yadiki
sumber
5

Lihat dokumentasi di MSDN untuk kelas Hashtable .

Merupakan kumpulan pasangan kunci dan nilai yang disusun berdasarkan kode hash kunci.

Juga, perlu diingat bahwa ini bukan thread-safe.

sinar
sumber
22
Dictionary<TKey, TValue>lebih disukai, karena kompilasi memeriksa jenis waktu dan karena itu tidak memerlukan tinju jenis nilai.
Thorarin
3

Gunakan Kamus - ini menggunakan hashtable tetapi typesafe.

Juga, kode Java Anda untuk

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

akan diberi kode terbaik dalam C # dengan cara ini:

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

Dengan cara ini, Anda dapat menentukan kebutuhan variabel "a" di dalam blok dan masih dapat diakses di luar blok jika Anda membutuhkannya nanti.

Shree Harsha
sumber
0

jawabannya adalah

Kamus

lihat fungsi saya, penambahan sederhana menggunakan fungsi anggota paling penting di dalam Kamus

fungsi ini kembali salah jika daftar berisi item duplikat

 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
    }
Basheer AL-MOMANI
sumber
0

Saya hanya ingin memberikan dua sen.
Ini sesuai dengan jawaban @Powerlord.

Letakkan "null" sebagai ganti string nol .

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");
}
ossobuko
sumber