Kommend von einer Java-Welt in eine C# ein gibt es ein HashMap-Äquivalent? Wenn nicht, was würden Sie empfehlen?
Antworten
Zu viele Anzeigen?Dictionary
ist wahrscheinlich am nächsten dran. System.Collections.Generic.Dictionary
implementiert die System.Collections.Generic.IDictionary
Schnittstelle (die ähnlich wie die Java-Schnittstelle Map
Schnittstelle).
Einige bemerkenswerte Unterschiede, die Sie beachten sollten:
- Hinzufügen/Erhalten von Artikeln
- Die HashMap von Java hat die
put
yget
Methoden zum Setzen/Erhalten von ElementenmyMap.put(key, value)
MyObject value = myMap.get(key)
- Das C# Dictionary verwendet
[]
Indizierung für das Setzen/Abrufen von ElementenmyDictionary[key] = value
MyObject value = myDictionary[key]
- Die HashMap von Java hat die
null
Tasten- Java's
HashMap
erlaubt Null-Schlüssel - .NETs
Dictionary
wirft einenArgumentNullException
wenn Sie versuchen, einen Nullschlüssel hinzuzufügen
- Java's
- Hinzufügen eines doppelten Schlüssels
- Java's
HashMap
wird der bestehende Wert durch den neuen ersetzt. - .NETs
Dictionary
ersetzt den bestehenden Wert durch den neuen Wert, wenn Sie[]
Indizierung. Wenn Sie dieAdd
Methode, wird stattdessen einArgumentException
.
- Java's
- Versuch, einen nicht existierenden Schlüssel zu erhalten
- Java's
HashMap
wird null zurückgeben. - .NETs
Dictionary
wirft eineKeyNotFoundException
. Sie können dieTryGetValue
statt der Methode[]
Indizierung, um dies zu vermeiden:
MyObject value = null; if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }
- Java's
Dictionary
hat eine ContainsKey
Methode, die zur Lösung der beiden vorgenannten Probleme beitragen kann.
Ich möchte Ihnen mit einem Beispiel des "Codaddict's Algorithm" helfen, ihn zu verstehen.
' Wörterbuch in C#' ist ' Hashmap in Java' im Paralleluniversum.
Einige Implementierungen sind unterschiedlich. Zum besseren Verständnis siehe das folgende Beispiel.
Java HashMap deklarieren:
Map<Integer, Integer> pairs = new HashMap<Integer, Integer>();
C# Wörterbuch deklarieren:
Dictionary<int, int> Pairs = new Dictionary<int, int>();
Abrufen eines Wertes von einem Ort:
pairs.get(input[i]); // in Java
Pairs[input[i]]; // in C#
Einstellen eines Wertes am Ort:
pairs.put(k - input[i], input[i]); // in Java
Pairs[k - input[i]] = input[i]; // in C#
Ein allgemeines Beispiel ist der Algorithmus von Codaddict.
Codaddict-Algorithmus in 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's Algorithmus in 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();
}
}
Verwenden Sie Dictionary - es verwendet hashtable, ist aber typsicher.
Außerdem ist Ihr Java-Code für
int a = map.get(key);
//continue with your logic
wird am besten in C# auf diese Weise kodiert:
int a;
if(dict.TryGetValue(key, out a)){
//continue with your logic
}
Auf diese Weise können Sie die Variable "a" innerhalb eines Blocks in den Anwendungsbereich einbeziehen und sie ist auch außerhalb des Blocks zugänglich, wenn Sie sie später benötigen.
Sehen Sie sich die Dokumentation auf MSDN für das Hashtabelle Klasse.
Stellt eine Sammlung von Schlüssel-Wert-Paaren dar, die auf der Grundlage des Hash-Codes des Schlüssels organisiert sind.
Denken Sie auch daran, dass dies nicht thread-sicher ist.
Die Antwort lautet
Wörterbuch
Schauen Sie sich meine Funktion an, sie ist einfach und verwendet die wichtigsten Mitgliedsfunktionen im Dictionary
diese Funktion gibt false zurück, wenn die Liste doppelte Einträge enthält
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
}
- See previous answers
- Weitere Antworten anzeigen