การมาจากโลกของ Java สู่ C # หนึ่งจะเทียบเท่า HashMap หรือไม่? ถ้าไม่ใช่คุณจะแนะนำอะไร
การมาจากโลกของ Java สู่ C # หนึ่งจะเทียบเท่า HashMap หรือไม่? ถ้าไม่ใช่คุณจะแนะนำอะไร
คำตอบ:
Dictionary
น่าจะใกล้เคียงที่สุด System.Collections.Generic.Dictionary
ใช้System.Collections.Generic.IDictionary
อินเตอร์เฟส (ซึ่งคล้ายกับMap
อินเตอร์เฟสของ Java )
ความแตกต่างที่โดดเด่นบางประการที่คุณควรทราบ:
put
และget
วิธีการตั้งค่า / รับไอเท็ม
myMap.put(key, value)
MyObject value = myMap.get(key)
[]
จัดทำดัชนีสำหรับการตั้งค่า / รับรายการ
myDictionary[key] = value
MyObject value = myDictionary[key]
null
กุญแจ
HashMap
อนุญาตให้ใช้คีย์ที่ไม่มีค่าDictionary
พ่นArgumentNullException
ถ้าคุณพยายามที่จะเพิ่มคีย์เป็นโมฆะHashMap
จะแทนที่ค่าที่มีอยู่ด้วยค่าใหม่Dictionary
จะแทนที่ค่าที่มีอยู่ด้วยค่าใหม่หากคุณใช้การ[]
จัดทำดัชนี ถ้าคุณใช้วิธีการมันแทนจะโยนAdd
ArgumentException
HashMap
จะคืนค่าว่างDictionary
KeyNotFoundException
คุณสามารถใช้TryGetValue
วิธีการแทนการ[]
ทำดัชนีเพื่อหลีกเลี่ยงปัญหานี้:MyObject value = null;
if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }
Dictionary
มีContainsKey
วิธีการที่สามารถช่วยจัดการกับปัญหาสองข้อก่อนหน้านี้
Dictionary
โยนข้อยกเว้นเมื่อเพิ่มคีย์ซ้ำ
if (!myDictionary.TryGetValue(key, value))
ต้องการout
ข้อโต้แย้งที่สอง ดังนั้นif (!myDictionary.TryGetValue(key, out value))
จากC # เทียบเท่ากับ Java HashMap
ฉันต้องการพจนานุกรมที่ยอมรับคีย์ "null" แต่ดูเหมือนว่าไม่มีเจ้าของภาษาอยู่แล้วดังนั้นฉันจึงเขียนของฉันเอง มันง่ายมากจริง ๆ แล้ว ฉันรับมาจากพจนานุกรมเพิ่มเขตข้อมูลส่วนตัวเพื่อเก็บค่าคีย์ "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>
ให้ฉันช่วยคุณเข้าใจด้วยตัวอย่างของ "อัลกอริทึมของ codaddict"
' พจนานุกรมใน C #' คือ ' Hashmapใน 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 ใน 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 ใน 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();
}
}
ใช้พจนานุกรม - มันใช้ hashtable แต่เป็นประเภทที่ปลอดภัย
นอกจากนี้รหัส Java ของคุณสำหรับ
int a = map.get(key);
//continue with your logic
จะได้รับรหัสที่ดีที่สุดใน C # ด้วยวิธีนี้:
int a;
if(dict.TryGetValue(key, out a)){
//continue with your logic
}
ด้วยวิธีนี้คุณสามารถกำหนดขอบเขตความต้องการของตัวแปร "a" ภายในบล็อกและยังสามารถเข้าถึงได้นอกบล็อกหากคุณต้องการในภายหลัง
คำตอบคือ
พจนานุกรม
ลองดูที่ฟังก์ชั่นของฉันการเพิ่มที่เรียบง่ายใช้ฟังก์ชั่นสมาชิกที่สำคัญที่สุดในพจนานุกรม
ฟังก์ชันนี้คืนค่า 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
}
ฉันแค่ต้องการให้สองเซ็นต์ของฉัน
เป็นไปตามคำตอบของ @Powerlord
วาง"null"แทนสตริงnull
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");
}