C # Java HashMap समकक्ष


325

एक जावा दुनिया से एक C # एक में आ रहा है वहाँ एक HashMap बराबर है? यदि नहीं तो आप क्या सलाह देंगे?

जवाबों:


481

Dictionaryशायद निकटतम है। इंटरफ़ेस को System.Collections.Generic.Dictionaryलागू करता System.Collections.Generic.IDictionaryहै (जो जावा के Mapइंटरफ़ेस के समान है )।

कुछ उल्लेखनीय अंतर जिनसे आपको अवगत होना चाहिए:

  • आइटम जोड़ना / प्राप्त करना
    • Java के HashMap में आइटम सेट करने / प्राप्त करने के तरीके putऔर getतरीके हैं
      • myMap.put(key, value)
      • MyObject value = myMap.get(key)
    • C # का शब्दकोश []सेटिंग / आइटम प्राप्त करने के लिए अनुक्रमण का उपयोग करता है
      • myDictionary[key] = value
      • MyObject value = myDictionary[key]
  • null चांबियाँ
    • जावा की HashMapअशक्त कुंजियाँ अनुमति देता है
    • यदि आप एक नल कुंजी जोड़ने की कोशिश करते हैं तो .NET का Dictionaryफेंकता हैArgumentNullException
  • डुप्लिकेट कुंजी जोड़ना
    • जावा के HashMapमौजूदा मूल्य को नए के साथ बदल देगा।
    • Dictionaryयदि आप []अनुक्रमणिका का उपयोग करते हैं तो .NET का मौजूदा मान नए के साथ बदल जाएगा । यदि आप Addविधि का उपयोग करते हैं , तो यह बदले में ए फेंक देगा ArgumentException
  • गैर-मौजूद कुंजी प्राप्त करने का प्रयास
    • जावा की HashMapअशक्त वापसी होगी।
    • .NET का Dictionaryफेंक देंगे KeyNotFoundException। इससे बचने TryGetValueके लिए आप []अनुक्रमणिका के बजाय विधि का उपयोग कर सकते हैं :
      MyObject value = null; if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }

Dictionaryकी एक ContainsKeyविधि है जो पिछली दो समस्याओं से निपटने में मदद कर सकती है।


9
कोई सटीक समतुल्य नहीं है (JAVA HashMap में शून्य मान और शून्य कुंजी की अनुमति है) download.oracle.com/javase/1.4.2/docs/api/java/util/…
Fabio Maulo

3
हां, शब्दकोश करीब है लेकिन सटीक नहीं है।
पॉवरलॉर्ड

14
नोट, Dictionaryडुप्लिकेट कुंजी जोड़ते समय अपवाद फेंकता है।
रुबेन्स मरिज़ो 20

4
इसके अलावा, गैर मौजूदा कुंजी के साथ एक मूल्य का अनुरोध करते समय एक अपवाद को फेंक दिया जाता है।
रबेंस मारीज़ो

if (!myDictionary.TryGetValue(key, value))outदूसरे तर्क के लिए की जरूरत है। तोif (!myDictionary.TryGetValue(key, out value))
बगयबनी

38

से जावा HashMap सी बराबर #

मुझे एक ऐसी डिक्शनरी की जरूरत थी, जिसने "अशक्त" कुंजी स्वीकार कर ली हो, लेकिन ऐसा लगता है कि कोई देशी नहीं है, इसलिए मैंने अपना लिखा है। यह वास्तव में बहुत सरल है। मुझे शब्दकोश से विरासत में मिला, "शून्य" कुंजी के लिए मान रखने के लिए एक निजी फ़ील्ड जोड़ा, फिर इंडेक्सर को ओवरराइट किया। यह इस प्रकार चलता है :

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>

6
क्या आप ऑब्जेक्ट को एक प्रकार का पैरामीटर बनाकर जेनरिक थीम जारी नहीं रख सकते हैं?
कोलाई लिथियम

यह काम नहीं करता है। सार्वजनिक स्ट्रिंगरिंग [[स्ट्रिंग कुंजी] {... सार्वजनिक होना चाहिए स्ट्रिंग इस [स्ट्रिंग कुंजी] {। इसके अलावा आधार [की] मेरी कोशिश से काम नहीं करेगा। मेरा सुझाव है कि IDEDIA को लागू करने और सिर्फ एक वैश्विक निजी शब्दकोश ऑब्जेक्ट होने और प्रत्येक तरीकों के लिए अशक्त मामले को संभालने के लिए।
A.sharif

4
मुझे आश्चर्य है कि आप अपने रास्ते से चूककर डिक्शनरी में क्यों चले गए।
जिम बाल्टर

5
@JimBalter स्पष्ट रूप से उन्हें एक शब्दकोश की आवश्यकता है।
फिलिप एल्म

17

मुझे "कोडडक्ट के एल्गोरिथ्म" के एक उदाहरण के साथ इसे समझने में मदद करने दें

समांतर ब्रह्मांड में ' डिक्शनरी इन सी #' जावा में ' हैशमैप ' है।

कुछ कार्यान्वयन अलग हैं। बेहतर समझने के लिए नीचे दिया गया उदाहरण देखें।

जावा हैशपार्क की घोषणा:

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#

एक समग्र उदाहरण कोडडक्ट के एल्गोरिथ्म के नीचे से देखा जा सकता है।

जावा में कोडडक्ट का एल्गोरिथ्म:

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

    }
}

सी # में कोडडक्ट का एल्गोरिथ्म

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

5

हैशटेबल वर्ग के लिए MSDN पर दस्तावेज़ देखें ।

कुंजी-और-मूल्य जोड़े के संग्रह का प्रतिनिधित्व करता है जो कुंजी के हैश कोड के आधार पर व्यवस्थित होते हैं।

इसके अलावा, ध्यान रखें कि यह थ्रेड-सुरक्षित नहीं है।


22
Dictionary<TKey, TValue>संकलन समय प्रकार की जाँच के कारण बेहतर है, और क्योंकि इसमें मूल्य प्रकारों की मुक्केबाजी की आवश्यकता नहीं है।
थोरारिन

3

शब्दकोश का प्रयोग करें - यह हैशटेबल का उपयोग करता है, लेकिन प्रकार है।

इसके अलावा, अपने जावा कोड के लिए

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

सी # में सबसे अच्छा कोडित किया जाएगा:

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

इस तरह, आप किसी ब्लॉक के अंदर "a" वेरिएबल की आवश्यकता को स्कोप कर सकते हैं और यदि आपको बाद में इसकी आवश्यकता है तो यह ब्लॉक के बाहर भी पहुंच योग्य है।


0

उत्तर है

शब्दकोश

मेरे कार्य को देखें, इसका सरल ऐड शब्दकोश के सबसे महत्वपूर्ण सदस्य कार्यों का उपयोग करता है

यह डुप्लिकेट गलत है यदि सूची में डुप्लिकेट आइटम हैं

 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 के उत्तर के अनुसार है।

अशक्त तारों के बजाय "अशक्त" डालता है ।

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");
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.