Исходя из Java-мира в С#, существует ли эквивалент HashMap? Если нет, что бы вы порекомендовали?
С# Java HashMap эквивалент
Ответ 1
Dictionary
, вероятно, самый близкий. System.Collections.Generic.Dictionary
реализует интерфейс System.Collections.Generic.IDictionary
(который похож на интерфейс Java Map
).
Некоторые заметные отличия, о которых вы должны знать:
- Добавление/получение элементов
- Java HashMap имеет методы
put
иget
для установки/получения элементов-
myMap.put(key, value)
-
MyObject value = myMap.get(key)
-
- Словарь С# использует индексирование
[]
для установки/получения элементов-
myDictionary[key] = value
-
MyObject value = myDictionary[key]
-
- Java HashMap имеет методы
-
null
ключи- Java
HashMap
позволяет использовать нулевые ключи - .NET
Dictionary
выдаетArgumentNullException
, если вы попытаетесь добавить нулевой ключ
- Java
- Добавление дублирующего ключа
- Java
HashMap
заменит существующее значение новым. - .NET
Dictionary
заменит существующее значение новым, если вы используете индексацию[]
. Если вы используете методAdd
, он вместо этого отправитArgumentException
.
- Java
- Попытка получить несуществующий ключ
- Java
HashMap
вернет null. - .NET
Dictionary
будет вызыватьKeyNotFoundException
. Вы можете использоватьTryGetValue
вместо индексации[]
, чтобы избежать этого:MyObject value = null; if (!myDictionary.TryGetValue(key, value)) { /* key doesn't exist */ }
- Java
Dictionary
имеет метод ContainsKey
, который может помочь решить две предыдущие проблемы.
Ответ 2
От С#, эквивалентный Java 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>
Ответ 3
Ознакомьтесь с документацией в MSDN для класса Hashtable.
Представляет коллекцию пар ключ-значение, которые организованы на основе хэш-кода ключа.
Кроме того, имейте в виду, что это не является потокобезопасным.
Ответ 4
Позвольте мне помочь вам разобраться с примером "алгоритма codaddict"
Словарь в С# '- это < Hashmap в Java "в параллельной юниверсе.
Некоторые реализации различны. См. Пример ниже, чтобы лучше понять.
Объявление Java 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#
Общий пример можно наблюдать из-под алгоритма 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 в С#
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 algorithm : O(n)
checkPairs(a, 10);
Console.Read();
}
}
Ответ 5
Я думаю, что лучше привести примеры, чтобы рассказать один из любимых.
Поэтому проверьте Collections и решите, какую коллекцию вы хотите использовать.
Ответ 6
ответ
Словарь
Посмотрите на мою функцию, ее простой add использует наиболее важные функции-члены в словаре
эта функция возвращает false, если список содержит элементы Duplicates
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
}
Ответ 7
Я просто хотел дать свои два цента.
Это соответствует ответу @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");
}