438 Stimmen

C# Java HashMap-Äquivalent

Kommend von einer Java-Welt in eine C# ein gibt es ein HashMap-Äquivalent? Wenn nicht, was würden Sie empfehlen?

654voto

Powerlord Punkte 84404

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 y get Methoden zum Setzen/Erhalten von Elementen
      • myMap.put(key, value)
      • MyObject value = myMap.get(key)
    • Das C# Dictionary verwendet [] Indizierung für das Setzen/Abrufen von Elementen
      • myDictionary[key] = value
      • MyObject value = myDictionary[key]
  • null Tasten
    • Java's HashMap erlaubt Null-Schlüssel
    • .NETs Dictionary wirft einen ArgumentNullException wenn Sie versuchen, einen Nullschlüssel hinzuzufügen
  • 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 die Add Methode, wird stattdessen ein ArgumentException .
  • Versuch, einen nicht existierenden Schlüssel zu erhalten
    • Java's HashMap wird null zurückgeben.
    • .NETs Dictionary wirft eine KeyNotFoundException . Sie können die TryGetValue statt der Methode [] Indizierung, um dies zu vermeiden:
      MyObject value = null; if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }

Dictionary hat eine ContainsKey Methode, die zur Lösung der beiden vorgenannten Probleme beitragen kann.

33voto

Ajay Yadiki Punkte 417

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

8voto

Shree Harsha Punkte 340

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.

6voto

Ray Punkte 1575

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.

0voto

Basheer AL-MOMANI Punkte 13273

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
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X