Değer nesnesinin alanlarından hangisinin anahtar olduğu bir karma Harita?

HashMap gibi bir sınıfın var olup olmadığını merak ettim, bu anahtarın içinde bir tanımlayıcı alan var.

Olmazsa, benim kullandığım sınıfı Map.Entry uygulamasında kullanacağımı düşünüyordum. Bu mantıklı bir yaklaşım gibi görünüyor mu yoksa tehlikeli görünüyor mu? (Anahtar alanım değişmez hale getireceğim.)

1
İkinci düşünceme göre, Map.Entry'nin public metodu setValue() olduğu için Map.Entry değerini yaratma kavramım geçerli değildir. "Bunu" başka bir değer olarak ayarlayamadığımdan, gerçekten yapılamaz.
katma yazar Joe, kaynak
Nesnenin nasıl görünüyor?
katma yazar Bhesh Gurung, kaynak
Bunun için neden özel bir haritaya ihtiyacın var? V sınıfını oluşturun, ona K üye alanı verin ve Harita oluşturun.
katma yazar Nate W., kaynak

4 cevap

Ben Map.Entry uygulamak değer olarak kullandığım sınıfı sahip olmayı düşünüyordum. Bu mantıklı bir yaklaşım gibi görünüyor mu yoksa tehlikeli görünüyor mu?

Tehlikeli olsun ya da olmasın, tek sorumluluk prensibini ihlal ettiği için kötü bir tasarımdır. Bir sınıf kendi eşyalarını yapmaktan ve aynı zamanda bir Map.Entry olmasından sorumlu olmamalıdır. Şimdi başka bir kitaplıkta kullanmak istediğinizde ne olur? Başka bir arayüz uygulamak zorunda mısın?

Map.Entry ( AbstractMap 'ı genişletmeye mi çalışıyorsunuz?) Uygulayarak kazanmayı umduğunuz şey açık değilken, size bu kokunun kötü olduğunu söyleyebilirim. uygulamada hiç görmedim.

Burada asıl sorun nedir? HashMap kullanmanın nesi yanlış?

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

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

MyClass retrievedObj = map.get("myId");
4
katma
Bence temel noktanız doğru. Sadece işleri daha az ayrıntılı hale getirmek için uğraşıyordum, ama bu süreçte muhtemelen biraz fantezi yapmaktaydım.
katma yazar Joe, kaynak

Hashtag'e nesneler (veya sınıflar) eklediğinizde, haritaya gönderilen anahtar feild'i seçersiniz. İstediğiniz anahtarı döndürecek olan sınıfınızda bir getKey() yöntemi yapın.

Daha sonra haritaya bir nesne eklerken kullanın

Örneğin, anahtar olarak Kimliğe (Dize) sahip bir Kişi Sınıfınız varsa. Bu işlevi yap:

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

Kişi nesnesini haritaya yerleştirirken kullanın:

Person1.getKey();
3
katma
@Shakedown İyi not için teşekkürler.
katma yazar Alon Adler, kaynak
Bu iyi bir yaklaşım. Bunu kullanacağımı düşünüyorum.
katma yazar Joe, kaynak
Yaptıklarından sonra ne isimlerini vermeyi severim, ne için kullanacaklarını değil. Bir Kişi nesnesi dizisi oluşturmak istediğinizde ne yapacaksınız, Kişi için getIndex() yöntemini ekleyecek misiniz? ? Yönteminizi getKey() olarak adlandırmamanızı tavsiye ederim çünkü neredeyse kesinlikle haritanızdaki bir anahtardan başka bir şey için bir bağlamda kullanacaksınız. getKey() öğenizin kimliğini döndürecekse, getKey() 'e gerek yoktur, sadece getId() komutunu kullanın.
katma yazar Nate W., kaynak

HashMap'i her zaman kullanabilir ve alanı anahtar olarak ekleyebilirsiniz (yine de değişmez hale getirecekseniz, bununla ilgili herhangi bir sorun görmüyorum).

0
katma

HashMap 'ın kendisi. Sadece nesne içindeki "tanımlayıcı alan" ın equals() ve hashCode() yöntemlerini uygun şekilde uyguladığından emin olun.

Örneğin. Sınıfınız:

public class YourObject {
    private String identifyingField;

Sonra:

Map yourMap = new HashMap();
0
katma