সি # জাভা হ্যাশম্যাপ সমতুল্য


325

জাভা বিশ্ব থেকে সি # তে আসছেন কি হ্যাশম্যাপ সমতুল্য? না হলে কি সুপারিশ করবেন?

উত্তর:


481

Dictionaryসম্ভবত সবচেয়ে কাছের। ইন্টারফেস System.Collections.Generic.Dictionaryপ্রয়োগ করে System.Collections.Generic.IDictionary(যা জাভার Mapইন্টারফেসের অনুরূপ )।

কিছু উল্লেখযোগ্য পার্থক্য যার বিষয়ে আপনার সচেতন হওয়া উচিত:

  • আইটেম যুক্ত করা / পাওয়া
    • জাভার হ্যাশম্যাপে আইটেমগুলি সেট করার / পাওয়ার জন্য putএবং getপদ্ধতি রয়েছে
      • myMap.put(key, value)
      • MyObject value = myMap.get(key)
    • সি # এর অভিধানে []আইটেমগুলি সেট করা / পাওয়ার জন্য সূচী ব্যবহার করা হয়
      • myDictionary[key] = value
      • MyObject value = myDictionary[key]
  • null কী
    • জাভার HashMapনাল কীগুলি অনুমতি দেয়
    • আপনি যদি নাল কী যুক্ত করার চেষ্টা করেন তবে নেট এটি একটি Dictionaryছুড়ে ফেলেArgumentNullException
  • একটি সদৃশ কী যুক্ত করা হচ্ছে
    • জাভাগুলি HashMapবিদ্যমান মানটিকে নতুনের সাথে প্রতিস্থাপন করবে।
    • .NET এর Dictionaryবিদ্যমান মানটিকে নতুনের সাথে প্রতিস্থাপন করবে যদি আপনি []ইনডেক্সিং ব্যবহার করেন । আপনি যদি Addপদ্ধতিটি ব্যবহার করেন তবে এটি পরিবর্তে একটি নিক্ষেপ করবে ArgumentException
  • অস্তিত্বের কীটি পাওয়ার চেষ্টা করা হচ্ছে
    • জাভার HashMapশূন্য ফিরে আসবে।
    • .NET গুলি Dictionaryএকটি নিক্ষেপ করবে KeyNotFoundExceptionTryGetValueএটি []এড়াতে আপনি সূচকের পরিবর্তে পদ্ধতিটি ব্যবহার করতে পারেন :
      MyObject value = null; if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }

Dictionaryএর একটি ContainsKeyপদ্ধতি রয়েছে যা আগের দুটি সমস্যা মোকাবেলায় সহায়তা করতে পারে।


9
একটি সঠিক সমতুল্য নেই (জাভা হ্যাশম্যাপে নাল মান এবং নাল কীকে অনুমতি দেয়) download.oracle.com/javase/1.4.2/docs/api/java/util/…
ফ্যাবিও মাওলো

3
হ্যাঁ, অভিধানটি কাছাকাছি হলেও সঠিক নয়।
পাওয়ারলর্ড

14
নোট, Dictionaryনকল কী যুক্ত করার সময় ব্যতিক্রম ছোঁড়া।
রুবেন্স মারিজুজ্জো

4
এছাড়াও, অ-বিদ্যমান কী সহ একটি মান অনুরোধ করার সময় একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয়।
রুবেন্স মারিজুজ্জো

if (!myDictionary.TryGetValue(key, value))outদ্বিতীয় যুক্তির জন্য একটি দরকার । সুতরাংif (!myDictionary.TryGetValue(key, out value))
বুগবুনি

38

থেকে জাভা HashMap সি সমতুল্য #

আমার একটি অভিধানের দরকার ছিল যা একটি "নাল" কী গ্রহণ করেছিল, তবে মনে হয় কোনও স্থানীয় নেই, তাই আমি নিজের লেখা লিখে রেখেছি written এটি আসলে খুব সহজ। আমি অভিধান থেকে উত্তরাধিকার সূত্রে পেয়েছি, "নাল" কীটির মান ধরে রাখতে একটি ব্যক্তিগত ক্ষেত্র যুক্ত করেছি, তারপরে সূচকটি ওভাররাইট করে ten এটা এইভাবেই চলে :

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
আপনি কী জেনেরিক থিমটি কোনও ধরণের পরামিতি তৈরি করে চালিয়ে যেতে পারেননি?
কলিথিয়াম

এটি কাজ করে না। পাবলিক স্ট্রিংডোরিয়রিয় [এই স্ট্রিং কী] {... এর স্ট্রিং এই [স্ট্রিং কী] public সর্বজনীন হওয়া উচিত {। এছাড়াও বেস [কী] আমার চেষ্টা থেকে কাজ করবে না। আমি আইডি অভিধানটি বাস্তবায়নের পরামর্শ দিচ্ছি এবং কেবল একটি বিশ্বব্যাপী প্রাইভেট ডিকশনারি অবজেক্ট রাখছি এবং প্রতিটি পদ্ধতির জন্য নাল কেস পরিচালনা করব।
শরীফ 21

4
আমি ভাবছি কেন আপনি অভিধানটি ভুল বানান থেকে বেরিয়ে গেছেন।
জিম বাল্টার

5
@ জিমবাল্টার স্পষ্টতই তাঁর একটি অভিধান প্রয়োজন।
ফিলিপ এলম

17

আমাকে "কোডাডটিক্টের অ্যালগরিদম" উদাহরণ দিয়ে এটি বুঝতে সাহায্য করুন

' অভিধান C #' 'হয় Hashmap সমান্তরাল মহাবিশ্বের জাভা'।

কিছু বাস্তবায়ন আলাদা। আরও ভাল করে বুঝতে নীচের উদাহরণটি দেখুন।

জাভা হ্যাশম্যাপ ঘোষণা:

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

সি # অভিধান ঘোষণা:

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

সেরা উত্তরের জন্য উত্সাহিত করুন, ধন্যবাদ
ucMedia

5

হ্যাশটেবল ক্লাসের জন্য এমএসডিএন-তে ডকুমেন্টেশন দেখুন ।

কী-এবং-মান জুটির একটি সংকলন উপস্থাপন করে যা কী এর হ্যাশ কোডের ভিত্তিতে সংগঠিত হয়।

এছাড়াও, মনে রাখবেন যে এটি থ্রেড-নিরাপদ নয়।


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
}

এইভাবে, আপনি কোনও ব্লকের ভিতরে "এ" ভেরিয়েবলের প্রয়োজনীয়তাটি স্কোপ করতে পারেন এবং আপনার যদি পরে এটির প্রয়োজন হয় তবে এটি ব্লকের বাইরেও অ্যাক্সেসযোগ্য।


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

আমি শুধু আমার দুটি সেন্ট দিতে চেয়েছিলাম।
এটি @ পাওয়ারলর্ডের উত্তর অনুসারে।

নাল স্ট্রিংয়ের পরিবর্তে "নাল" রাখে ।

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");
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.