Эквивалент C# Java HashMap
из мира Java в мир C# есть ли эквивалент HashMap? Если нет, что бы вы порекомендовали?
7 ответов
Dictionary
наверное, ближе. System.Collections.Generic.Dictionary
осуществляет System.Collections.Generic.IDictionary
интерфейс (который похож на Java Map
интерфейс).
некоторые заметные различия, которые вы должны знать:
- добавление/получение предметов
- HashMap Java имеет
put
иget
методы для установки/получения товаровmyMap.put(key, value)
MyObject value = myMap.get(key)
- C# ' s Словарь использует
[]
индексирование для установки/получения товаровmyDictionary[key] = value
MyObject value = myDictionary[key]
- HashMap Java имеет
-
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
's есть ContainsKey
метод, который может помочь справиться с двумя предыдущими проблемами.
мне нужен был словарь, который принял" нулевой " ключ, но, похоже, нет родного, поэтому я написал свой собственный. На самом деле все очень просто. Я унаследовал от словаря, добавил частное поле для хранения значения ключа "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, но является typesafe.
кроме того, ваш 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");
}