C # Java HashMap eşdeğeri


325

Bir Java dünyasından bir C # 'a geliyor bir HashMap eşdeğeri var mı? Değilse ne önerirsiniz?

Yanıtlar:


481

Dictionarymuhtemelen en yakın olanıdır. (Java'nın arayüzüne benzeyen) arayüzü System.Collections.Generic.Dictionaryuygular .System.Collections.Generic.IDictionaryMap

Dikkat etmeniz gereken bazı önemli farklılıklar:

  • Öğe Ekleme / Alma
    • Java'nın HashMap öğelerini ayarlama / alma yöntemleri putveget
      • myMap.put(key, value)
      • MyObject value = myMap.get(key)
    • C # 'ın Sözlük []öğeleri ayarlamak / almak için endeksleme kullanır
      • myDictionary[key] = value
      • MyObject value = myDictionary[key]
  • null anahtarlar
    • Java'nın HashMapboş anahtarlara izin vermesi
    • .NET en Dictionarybir atar ArgumentNullExceptionEğer boş anahtarı eklemeye çalışırsanız
  • Yinelenen bir anahtar ekleme
    • Java'lar HashMapmevcut değeri yenisiyle değiştirir.
    • .NET en Dictionarykullanırsanız yenisi ile mevcut değerini değiştirecektir []indeksleme. AddYöntemi kullanırsanız , bunun yerine bir ArgumentException.
  • Varolmayan bir anahtar almaya çalışmak
    • Java HashMapnull değerini döndürür.
    • .NET en Dictionarybir atacağım KeyNotFoundException. Bundan kaçınmak TryGetValueiçin []dizin oluşturma yerine yöntemi kullanabilirsiniz :
      MyObject value = null; if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }

Dictionary'nin ContainsKeyönceki iki problemle başa çıkmasına yardımcı olabilecek bir yöntemi vardır.


9
Tam bir eşdeğer yoktur (JAVA
HashMap'te

3
Evet, sözlük yakın ama kesin değil.
Powerlord

14
Not, Dictionaryçoğaltılmış anahtar eklerken İstisnalar atar.
Rubens Mariuzzo

4
Ayrıca, var olmayan bir anahtarla bir değer istendiğinde bir İstisna atılır.
Rubens Mariuzzo

if (!myDictionary.TryGetValue(key, value))outikinci argüman için bir ihtiyacı var . Yaniif (!myDictionary.TryGetValue(key, out value))
bugybunny

38

Gönderen Java HashMap C # eşdeğer

"Null" anahtarını kabul eden bir sözlüğe ihtiyacım vardı, ama yerel bir tane yok gibi görünüyor, bu yüzden kendim yazdım. Aslında çok basit. Dictionary'den devralındım, "null" anahtarının değerini tutmak için özel bir alan ekledim, sonra dizinleyicinin üzerine yazdım. Bu böyle devam ediyor :

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

Umarım bu gelecekte birine yardımcı olur.

==========

Bu formatta değiştirdim

public class NullableDictionnary : Dictionary<string, object>

6
Nesneyi bir tür parametresi yaparak jenerik temasına devam edemediniz mi?
colithium

Bu işe yaramıyor. public StringDictionary bu [dize anahtarı] {... herkese açık Dize Bu [dize anahtarı] {. Ayrıca temel [key] denemeden çalışmayacak. Ben IDictionary uygulamak ve sadece küresel bir özel sözlük nesnesi olması ve yöntemlerin her biri için boş durumda işleme öneririz.
A.sharif

4
Acaba neden yanlış Sözlük Sözlük yolumdan gittim.
Jim Balter

5
@JimBalter Açıkçası bir sözlüğe ihtiyacı var.
Phillip Elm

17

"Codaddict algoritması" örneği ile anlamana yardım edeyim

' C #' da Sözlük 'paralel evrende' Java'da Hashmap'dir .

Bazı uygulamalar farklıdır. Daha iyi anlamak için aşağıdaki örneğe bakın.

Java HashMap'in Bildirilmesi:

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

C # Sözlüğü:

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

Bir konumdan değer alma:

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

Konumda bir değer ayarlama:

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

Genel Bir Örnek, Codaddict algoritmasının altından görülebilir.

codaddict'in Java algoritması:

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

5

Hashtable sınıfı için MSDN'deki belgelere bakın .

Anahtarın karma koduna göre düzenlenmiş bir anahtar ve değer çiftleri koleksiyonunu temsil eder.

Ayrıca, bunun iş parçacığı için güvenli olmadığını unutmayın.


22
Dictionary<TKey, TValue>Derleme zamanı türü denetimi ve değer türlerinin boksunu gerektirmediği için tercih edilir.
Thorarin

3

Sözlük Kullan - hashtable kullanıyor ancak typesafe.

Ayrıca, için Java kodunuz

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

en iyi C # ile bu şekilde kodlanacaktır:

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

Bu şekilde, bir blok içindeki "a" değişkeninin ihtiyacını karşılayabilirsiniz ve daha sonra ihtiyacınız varsa blok dışında da erişilebilir.


0

cevap

Sözlük

benim fonksiyon bakmak, onun basit eklemek Sözlük içindeki en önemli üye fonksiyonları kullanır

Liste Yinelenen öğeler içeriyorsa bu işlev false değerini döndürür

 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

Sadece iki sentimi vermek istedim.
Bu @ Powerlord'un cevabına göre.

Boş dizeler yerine "null" koyar .

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");
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.