Qiymat ob'ektining maydonchalarining kalitida kaliti bo'lgan xash xaritasi?

HashMap kabi kalit mavjud bo'lgan ob'ektda identifikatsiya qilish maydoni bo'lganmi yoki yo'qmi deb hayron bo'ldim.

Agar yo'q bo'lsa, men Map.Entry ni amalga oshirish uchun foydalanadigan sinfga ega bo'lishni o'ylay boshladim. Bu oqilona yondashuv kabi ko'rinadimi yoki xavfli bo'lib tuyuladimi? (Men kalit maydonni o'zgarmas qilaman.)

1
Ikkinchi fikrda, Map.Entry qiymatini joriy qilish kontseptsiyasi, Map.Entry ning public method setValue() ga ega bo'lgani uchun amal qilmaydi. Men "bu" ni boshqa qiymatga aylantira olmaganimdan beri, albatta, amalga oshirilmaydi.
qo'shib qo'ydi muallif Joe, manba
Ob'ektingiz qanday ko'rinishda?
qo'shib qo'ydi muallif Bhesh Gurung, manba
Buning uchun nima uchun maxsus xarita kerak? V sinfini yaratish, uni K a'zo maydoniga kiriting va Map yarating.
qo'shib qo'ydi muallif Nate W., manba

4 javoblar

Map.Entry ni amalga oshirishda foydalanadigan sinfga ega bo'lishni o'ylardim. Bu mantiqiy yondashuvga o'xshaydi yoki bu xavfli bo'lib tuyuladimi?

Xavfli yoki yo'q, bu yomon dizayn, chunki u bitta javobgarlik tamoyilini buzadi. . Sinf o'z narsalarini bajarish, shuningdek, Map.Entry bo'lish uchun javobgar bo'lmasligi kerak. Endi uni boshqa kutubxonada ishlatmoqchi bo'lganingizda nima bo'ladi? Boshqa interfeysni amalga oshirishingiz kerakmi?

Map.Entry (siz AbstractMap ) kengaytirishga harakat qilsangiz nima qilishingizni umid qilsam, bu menga yomon hidni aytadi va men amaliyotda hech qachon ko'rmaganman.

Bu erda qanday muammolar mavjud? HashMap dan foydalanishda xatolik nima?

Map map = new HashMap();
MyClass myObj = new MyClass("myId");

//...
map.put(myObj.getIdentifier(), myObj);

MyClass retrievedObj = map.get("myId");
4
qo'shib qo'ydi
Sizning asosiy fikringiz to'g'ri deb o'ylayman. Men shunchaki narsalarni kamroq tushuntirishga harakat qilardim, lekin bu jarayonda ehtimol bir oz tasavvur qilishim kerak edi.
qo'shib qo'ydi muallif Joe, manba

Hashmapga moslamalarni (yoki sinflarni) qo'shsangiz, siz xaritaga yuborilgan kalit feildni tanlaysiz. Sizning sinfingizdagi getKey() usulini tanlang, bu siz xohlagan kalitni qaytaradi.

So'ngra, xaritaga ob'ektni kiritish paytida foydalaning

Misol uchun, kalit (ID) bilan identifikatoringiz bor bo'lsa (kalit). Ushbu funktsiyani bajaring:

public String getKey()
{
   return this.Id; //Or use the getter method
}

Va shaxsni xaritaga kiritganda uni ishlatish:

Person1.getKey();
3
qo'shib qo'ydi
@Shakedown Yaxshi nota uchun rahmat.
qo'shib qo'ydi muallif Alon Adler, manba
Bu yaxshi yondashuv. Men buni qo'llayman deb o'ylayman.
qo'shib qo'ydi muallif Joe, manba
Men ular nima qilishidan qat'i nazar, ularning usullarini nomlashni yaxshi ko'raman. Person moslamalarni yaratish uchun nima qilish kerak, Person uchun getIndex() usulini qo'shasizmi? ? getKey() usulini nomlashni tavsiya etmayman, chunki siz uni xaritada kalitdan boshqa narsa uchun ishlatadigan kontekstda deyarli aniq foydalanasiz. getKey() sizning ID raqamini qaytarib beradigan bo'lsa, getKey() kodiga kerak emas, faqat getId() dan foydalaning.
qo'shib qo'ydi muallif Nate W., manba

Siz har doim HashMap dan foydalanishingiz mumkin va maydonni kalit sifatida qo'shishingiz mumkin (agar siz buni o'zgartirmasangiz, bu bilan hech qanday muammo ko'rmayapman).

0
qo'shib qo'ydi

Bu HashMap o'zi. Ob'ektdagi "identifikatsiya maydoni" ning equals() va hashCode() usullarini to'g'ri bajarganligiga ishonch hosil qiling.

Masalan, Agar sizning sinfingiz:

public class YourObject {
    private String identifyingField;

Keyin:

Map yourMap = new HashMap();
0
qo'shib qo'ydi