C # Java HashMap-Äquivalent


325

Gibt es ein HashMap-Äquivalent, wenn Sie aus einer Java-Welt in eine C # -Ele kommen? Wenn nicht, was würden Sie empfehlen?

Antworten:


481

Dictionaryist wahrscheinlich der nächste. System.Collections.Generic.Dictionaryimplementiert die System.Collections.Generic.IDictionarySchnittstelle (die der Java- MapSchnittstelle ähnlich ist ).

Einige bemerkenswerte Unterschiede, die Sie beachten sollten:

  • Elemente hinzufügen / abrufen
    • Javas HashMap verfügt über die Methoden putund getzum Festlegen / Abrufen von Elementen
      • myMap.put(key, value)
      • MyObject value = myMap.get(key)
    • Das Wörterbuch von C # verwendet die []Indizierung zum Festlegen / Abrufen von Elementen
      • myDictionary[key] = value
      • MyObject value = myDictionary[key]
  • null Schlüssel
    • Java HashMaperlaubt Nullschlüssel
    • .NET Dictionarylöst einen aus, ArgumentNullExceptionwenn Sie versuchen, einen Nullschlüssel hinzuzufügen
  • Hinzufügen eines doppelten Schlüssels
    • Java HashMapersetzt den vorhandenen Wert durch den neuen.
    • .NETs Dictionaryersetzen den vorhandenen Wert durch den neuen, wenn Sie die []Indizierung verwenden. Wenn Sie die AddMethode verwenden, wird stattdessen eine ausgelöst ArgumentException.
  • Versuch, einen nicht vorhandenen Schlüssel zu erhalten
    • Java gibt HashMapnull zurück.
    • .NETs Dictionarywerfen a KeyNotFoundException. Sie können die TryGetValueMethode anstelle der []Indizierung verwenden, um dies zu vermeiden:
      MyObject value = null; if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }

Dictionary's hat eine ContainsKeyMethode, die helfen kann, die beiden vorherigen Probleme zu lösen.


9
Es gibt kein genaues Äquivalent (in JAVA erlaubt HashMap Nullwerte und den
Nullschlüssel

3
Ja, das Wörterbuch ist nah, aber nicht genau.
Powerlord

14
Hinweis: DictionaryLöst Ausnahmen aus, wenn ein duplizierter Schlüssel hinzugefügt wird.
Rubens Mariuzzo

4
Außerdem wird eine Ausnahme ausgelöst, wenn ein Wert mit einem nicht vorhandenen Schlüssel angefordert wird.
Rubens Mariuzzo

if (!myDictionary.TryGetValue(key, value))braucht ein outfür das zweite Argument. Alsoif (!myDictionary.TryGetValue(key, out value))
Bugybunny

38

Von C # entspricht Java HashMap

Ich brauchte ein Wörterbuch, das einen "Null" -Schlüssel akzeptierte, aber es scheint keinen nativen zu geben, also habe ich mein eigenes geschrieben. Eigentlich ist es sehr einfach. Ich habe von Dictionary geerbt, ein privates Feld hinzugefügt, um den Wert für den Schlüssel "null" zu speichern, und dann den Indexer überschrieben. Es geht so :

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

Hoffe das hilft jemandem in der Zukunft.

==========

Ich habe es auf dieses Format geändert

public class NullableDictionnary : Dictionary<string, object>

6
Könnten Sie das generische Thema nicht fortsetzen, indem Sie das Objekt zu einem Typparameter machen?
Colithium

Das funktioniert nicht. public StringDictionary this [string key] {... sollte public String this [string key] {sein. Auch base [key] funktioniert bei meinem Versuch nicht. Ich schlage vor, IDictionary zu implementieren und nur ein globales privates Wörterbuchobjekt zu haben und den Nullfall für jede der Methoden zu behandeln.
A. Sharif

4
Ich frage mich, warum Sie sich die Mühe gemacht haben, Dictionary falsch zu schreiben.
Jim Balter

5
@ JimBalter Klar, er braucht ein Wörterbuch.
Phillip Elm

17

Lassen Sie mich Ihnen anhand eines Beispiels für den "Codaddict-Algorithmus" helfen, dies zu verstehen.

' Dictionary in C #' ist ' Hashmap in Java' im Paralleluniversum.

Einige Implementierungen sind unterschiedlich. Sehen Sie sich das folgende Beispiel an, um es besser zu verstehen.

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 Werts von einem Standort:

pairs.get(input[i]); // in Java
Pairs[input[i]];     // in C#

Festlegen eines Werts am Standort:

pairs.put(k - input[i], input[i]); // in Java
Pairs[k - input[i]] = input[i];    // in C#

Ein Gesamtbeispiel kann unter dem Codaddict-Algorithmus beobachtet werden.

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

Upvote für die beste Antwort, danke
ucMedia

5

Lesen Sie die Dokumentation zu MSDN für die Hashtable- Klasse.

Stellt eine Sammlung von Schlüssel-Wert-Paaren dar, die basierend auf dem Hash-Code des Schlüssels organisiert sind.

Beachten Sie auch, dass dies nicht threadsicher ist.


21
Dictionary<TKey, TValue>ist vorzuziehen, da die Überprüfung des Typs zur Kompilierungszeit erfolgt und kein Boxen von Werttypen erforderlich ist.
Thorarin

3

Wörterbuch verwenden - Es verwendet eine Hashtabelle, ist jedoch typsicher.

Auch Ihr Java-Code für

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

wird am besten in C # wie folgt codiert:

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

Auf diese Weise können Sie die Notwendigkeit der Variablen "a" innerhalb eines Blocks erfassen und sie ist auch außerhalb des Blocks verfügbar, wenn Sie sie später benötigen.


0

die Antwort ist

Wörterbuch

Schauen Sie sich meine Funktion an, deren einfaches Hinzufügen die wichtigsten Elementfunktionen im Wörterbuch verwendet

Diese Funktion gibt false zurück, wenn die Liste doppelte Elemente 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
    }

0

Ich wollte nur meine zwei Cent geben.
Dies entspricht der Antwort von @Powerlord.

Setzt "null" anstelle von null Zeichenfolgen.

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");
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.