C # Java HashMap 동등


325

Java 세계에서 C #으로 오면 HashMap에 해당하는 것이 있습니까? 그렇지 않다면 무엇을 추천 하시겠습니까?

답변:


481

Dictionary아마 가장 가까운 것입니다. 인터페이스를 System.Collections.Generic.Dictionary구현합니다 System.Collections.Generic.IDictionary(Java Map인터페이스 와 유사 ).

주의해야 할 몇 가지 중요한 차이점은 다음과 같습니다.

  • 아이템 추가 / 받기
    • Java의 HashMap에는 항목을 설정 / 받기위한 putget메소드가 있습니다.
      • myMap.put(key, value)
      • MyObject value = myMap.get(key)
    • C # 사전은 []항목 설정 / 가져 오기를 위해 인덱싱을 사용 합니다.
      • myDictionary[key] = value
      • MyObject value = myDictionary[key]
  • null 열쇠
    • Java HashMap는 null 키를 허용합니다
    • .NET의는 Dictionary를 던졌습니다 ArgumentNullException당신이 널 키를 추가하려고하면
  • 중복 키 추가
    • Java HashMap는 기존 값을 새로운 값으로 대체합니다.
    • 인덱싱 Dictionary을 사용하는 경우 .NET 은 기존 값을 새 값으로 []바꿉니다. 이 Add메소드 를 사용 하면 대신을 발생 ArgumentException시킵니다.
  • 존재하지 않는 키를 얻으려고 시도
    • Java HashMap는 null을 반환합니다.
    • .NET Dictionary은을 던질 것 KeyNotFoundException입니다. 이를 피하기 위해 인덱싱 TryGetValue대신 메소드를 사용할 수 있습니다 [].
      MyObject value = null; if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }

DictionaryContainsKey두 가지 문제를 해결하는 데 도움 이되는 방법이 있습니다.


9
JAVA HashMap에서 null 값과 null 키를 허용하는 정확한 값은 없습니다. download.oracle.com/javase/1.4.2/docs/api/java/util/…
Fabio Maulo

3
예, 사전은 가깝지만 정확하지는 않습니다.
Powerlord

14
참고 Dictionary중복 키를 추가 할 때 예외가 발생합니다.
Rubens Mariuzzo

4
또한 기존 키가 아닌 값을 요청하면 예외가 발생합니다.
Rubens Mariuzzo

if (!myDictionary.TryGetValue(key, value))가 필요 out두 번째 인수에 대해. 그래서if (!myDictionary.TryGetValue(key, out value))
bugybunny

38

에서 자바의 HashMap에 C #을 동등한

"널 (null)"키를 허용하는 사전이 필요했지만 기본 키가없는 것 같아서 직접 작성했습니다. 실제로는 매우 간단합니다. Dictionary에서 상속하고 "null"키 값을 보유하는 개인 필드를 추가 한 다음 인덱서를 덮어 썼습니다. 다음과 같이 진행됩니다.

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

이것이 미래의 누군가를 돕기를 바랍니다.

==========

이 형식으로 수정했습니다

public class NullableDictionnary : Dictionary<string, object>

6
객체를 유형 매개 변수로 만들어 제네릭 테마를 계속 진행할 수 없습니까?
colithium

작동하지 않습니다. public StringDictionary this [문자열 키] {...은 public string this [문자열 키] {이어야합니다. 또한 기본 [키]는 내 시도에서 작동하지 않습니다. IDictionary를 구현하고 전역 개인 사전 객체를 보유하고 각 메소드에 대해 null을 처리하는 것이 좋습니다.
A.sharif

4
사전 철자가 틀린 이유가 궁금합니다.
Jim Balter

5
@JimBalter 분명히 그는 사전이 필요합니다.
Phillip Elm

17

"codaddict 's algorithm"의 예를 통해 이해하도록 도와 드리겠습니다.

' C # 의 사전 '은 병렬 유니버스에서 'Java의 해시 맵 '입니다.

일부 구현은 다릅니다. 더 잘 이해하려면 아래 예를 참조하십시오.

Java HashMap 선언 :

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

C # 사전 선언 :

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

위치에서 가치 얻기 :

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

위치에서 값 설정 :

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

Codaddict의 알고리즘 아래에서 전반적인 예를 볼 수 있습니다.

자바에서 codaddict의 알고리즘 :

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

    }
}

C #의 Codaddict 알고리즘

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 클래스 에 대한 MSDN 설명서를 확인하십시오 .

키의 해시 코드를 기반으로 구성된 키-값 쌍의 모음을 나타냅니다.

또한 이것은 스레드로부터 안전하지 않다는 것을 명심하십시오.


22
Dictionary<TKey, TValue>컴파일 시간 유형 검사 및 값 유형 상자를 필요로하지 않기 때문에 바람직합니다.
Thorarin

3

사전 사용-해시 테이블을 사용하지만 형식이 안전합니다.

또한 Java 코드

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

다음과 같이 C #으로 가장 잘 코딩됩니다.

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

이런 식으로 블록 내부에 변수 "a"의 범위를 지정할 수 있으며 나중에 필요할 경우 블록 외부에서 여전히 액세스 할 수 있습니다.


0

정답은

사전

내 함수를 살펴보십시오. 간단한 추가는 사전 내에서 가장 중요한 멤버 함수를 사용합니다.

이 함수는 목록에 중복 항목이 포함되어 있으면 false를 반환합니다.

 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

나는 단지 2 센트를주고 싶었다.
이것은 @Powerlord의 답변에 따릅니다.

문자열 대신 "널"을 넣습니다 .

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");
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.