C # JAVA HASHMAP-equivalent

Komend van een Java-wereld in een C # One is er een hasjmap-equivalent? Zo niet, wat zou u aanbevelen?


Antwoord 1, Autoriteit 100%

Dictionaryis waarschijnlijk het dichtst in de buurt. System.Collections.Generic.DictionaryImplementeert de System.Collections.Generic.IDictionaryinterface (die vergelijkbaar is met Java’s MapInterface).

Enkele opmerkelijke verschillen waar u op de hoogte moet zijn van:

  • items toevoegen / krijgen
    • Java’s Hashmap heeft de puten getmethoden voor het instellen / krijgen van items
      • myMap.put(key, value)
      • MyObject value = myMap.get(key)
    • C # ‘s Woordenboek gebruikt []indexeren voor instelling / het krijgen van items
      • myDictionary[key] = value
      • MyObject value = myDictionary[key]
  • nullsleutels
    • JAVA’S HashMapMOETEN NULL KEYS
    • .NET’s DictionaryThoei een ArgumentNullExceptionAls u probeert een null-toets toe te voegen
  • Een dubbele sleutel toevoegen
    • JAVA’S HashMapVervangt de bestaande waarde met de nieuwe.
    • .NET’s DictionaryVervangt de bestaande waarde met de nieuwe als u []indexering gebruikt. Als u de Add-methode, gooit deze in plaats daarvan een ArgumentException.
  • pogingen om een ​​niet-bestaande sleutel te krijgen
    • JAVA’S HashMapKeert null.
    • .NET’s DictionaryGooi een KeyNotFoundException. U kunt de TryGetValuemethode in plaats van de []indexering om dit te vermijden:
      MyObject value = null;
      if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }

Dictionary‘s heeft een ContainsKeymethode die kan helpen omgaan met de vorige twee problemen.


Antwoord 2, Autoriteit 7%

van C # Equivalent naar Java Hashmap

Ik had een woordenboek nodig die een “null” -toets accepteerde, maar er lijkt geen native te zijn, dus ik heb het mijne geschreven. Het is eigenlijk heel eenvoudig. Ik heb geërfd van woordenboek, voegde een privéveld toe om de waarde voor de “NULL” -toets te houden, vervolgens de indexer overschreven. Het gaat als volgt:

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

Ik hoop dat dit iemand in de toekomst helpt.

==========

Ik heb het aangepast naar dit formaat

public class NullableDictionnary : Dictionary<string, object>

Antwoord 3, autoriteit 3%

Laat me je helpen het te begrijpen met een voorbeeld van “codaddict’s algoritme”

Woordenboekin C#’ is ‘Hashmapin Java’ in een parallel universum.

Sommige implementaties zijn anders. Bekijk het onderstaande voorbeeld om het beter te begrijpen.

Java HashMap declareren:

Map<Integer, Integer> pairs = new HashMap<Integer, Integer>();

C#-woordenboek declareren:

Dictionary<int, int> Pairs = new Dictionary<int, int>();

Een waarde ophalen van een locatie:

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

Een waarde instellen op locatie:

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

Een algemeen voorbeeld kan worden bekeken van onder het algoritme van Codaddict.

het algoritme van codaddict 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);
    }
}

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

Antwoord 4

Bekijk de documentatie op MSDN voor de Hashtabelklasse.

Vertegenwoordigt een verzameling sleutel-en-waardeparen die zijn georganiseerd op basis van de hashcode van de sleutel.

Houd er ook rekening mee dat dit niet thread-safe is.


Antwoord 5

Gebruik woordenboek – het gebruikt hashtabel maar is typeveilig.

Ook uw Java-code voor

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

wordt het beste op deze manier in C# gecodeerd:

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

Op deze manier kunt u de behoefte aan variabele “A” in een blok bereikt en het is nog steeds toegankelijk buiten het blok als u het later nodig hebt.


Antwoord 6

Het antwoord is

Woordenboek

Kijk naar mijn functie, het eenvoudige toevoegen gebruik van het belangrijkste lidfuncties binnen woordenboek

Deze functie retourneert false als de lijst met duplicaten items

bevat

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
    }

Antwoord 7

Ik wilde mijn twee cent gewoon geven.
Dit is volgens het antwoord van @powerlord.

Zet “null” in plaats van null snaren.

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

Other episodes