C# Java HashMap эквивалент



исходя из мира Java в C# one есть ли эквивалент HashMap? Если нет, то что бы вы порекомендовали?

651   7  

7 ответов:

Dictionary наверное, ближе. System.Collections.Generic.Dictionary осуществляет System.Collections.Generic.IDictionary интерфейс (который похож на Java Map интерфейс).

некоторые заметные различия, которые вы должны знать:

  • добавление/получение предметов
      в Java есть put и get методы настройки / получения элементов
      • myMap.put(key, value)
      • MyObject value = myMap.get(key)
  • C# ' s Словарь использует [] индексирование для установки/получения товаров
    • myDictionary[key] = value
    • MyObject value = myDictionary[key]
  • null ключи
    • Java HashMap позволяет нулевые ключи
    • Dictionary выдает ArgumentNullException если вы пытаетесь добавить нулевой ключ
  • добавление дубликата ключа
    • Java HashMap заменит существующее значение на новое один.
    • Dictionary заменит существующее значение на новое, если вы используете [] индексирование. Если вы используете Add метод, вместо этого он бросит ArgumentException.
  • попытка получить несуществующий ключ
    • Java HashMap вернет null.
    • Dictionary бросит KeyNotFoundException. Вы можете использовать TryGetValue метод вместо [] индексации, чтобы избежать это:
      MyObject value = null; if (!myDictionary.TryGetValue(key, value)) { /* key doesn't exist */ }
  • Dictionary's есть ContainsKey метод, который может помочь справиться с двумя предыдущими проблемами.

    С C# эквивалентно Java HashMap

    мне нужен был словарь, который принимал" нулевой " ключ, но, похоже, нет родного, поэтому я написал свой собственный. На самом деле все очень просто. Я унаследовал от словаря, добавил частное поле для хранения значения для ключа "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;
                }
            }
        }
    }
    

    надеюсь, это поможет кому-то в будущем.

    ==========

    Я изменил его на этот формат

    public class NullableDictionnary : Dictionary<string, object>
    

    позвольте мне помочь вам понять это на примере "алгоритма codaddict"

    'словарь в C# 'is'Hashmap в Java в параллельной вселенной.

    некоторые реализации отличаются. Смотрите пример ниже, чтобы лучше понять.

    Объявление Java HashMap:

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

    Объявление Словаря C#:

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

    получение значения из a местонахождение:

    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#
    

    общий пример можно наблюдать снизу алгоритма Codaddict.

    алгоритм codaddict в 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);
    
        }
    }
    

    алгоритм 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();
        }
    }
    

    проверьте документацию на MSDN для Hashtable класса.

    представляет коллекцию пар ключ-значение, которые организованы на основе хэш-кода ключа.

    кроме того, имейте в виду, что это не потокобезопасными.

    использовать словарь-он использует hashtable, но является типобезопасным.

    кроме того, ваш Java-код

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

    будет лучше всего закодирован в C# таким образом:

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

    таким образом, вы можете определить необходимость переменной "a" внутри блока, и она по-прежнему доступна за пределами блока, если вам это нужно позже.

    ответ

    словарь

    взгляните на мою функцию, ее простое добавление использует самые важные функции-члены внутри словаря

    эта функция возвращает false, если список содержит дубликаты элементов

     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
        }
    

    Я просто хотел отдать свои два цента.
    Это согласно ответу @Powerlord.

    ставит "null" вместо 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");
    }
    

    Comments

      Ничего не найдено.