Хэш-карта, в которой ключом является один из полей объекта значения? - PullRequest
1 голос
/ 27 октября 2011

Мне было интересно, существует ли такой класс, как HashMap, в котором ключ является идентифицирующим полем в объекте.

Если нет, я думал о том, чтобы класс, который я использую в качестве значения, реализовал Map.entry.Кажется ли это разумным подходом или опасным?(Я сделаю свое ключевое поле неизменным.)

Ответы [ 4 ]

4 голосов
/ 27 октября 2011

Я думал о том, чтобы использовать класс, который я использую в качестве значения, реализующего Map.Entry.Кажется ли это разумным подходом или опасным?

Опасно или нет, это плохой дизайн, поскольку он нарушает принцип единоличной ответственности .Класс не должен нести ответственность за выполнение своих собственных задач, а также за то, что он Map.Entry.Что происходит, когда вы хотите использовать его в другой библиотеке?Вам нужно реализовать другой интерфейс?

Хотя мне неясно, что вы надеетесь получить, внедрив Map.Entry (вы пытаетесь расширить AbstractMap?), Я могу вам сказать, что это пахнет плохои я никогда не видел, чтобы это было сделано на практике.

В чем здесь проблема?Что не так с использованием HashMap?

Map<String, MyClass> map = new HashMap<String, MyClass>();
MyClass myObj = new MyClass("myId");

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

MyClass retrievedObj = map.get("myId");
3 голосов
/ 27 октября 2011

Когда вы добавляете объекты (или классы) в хэш-карту, вы выбираете поле ключа, отправляемое на карту.Просто создайте метод getKey () внутри вашего класса, который вернет желаемый ключ.

Затем используйте его при вставке объекта на карту

Например, если у вас есть класс Person с идентификатором(Строка) в качестве ключа.Сделайте эту функцию:

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

И используйте ее при вставке объекта Person на карту:

Person1.getKey();
0 голосов
/ 27 октября 2011

Это само HashMap. Просто убедитесь, что «поле идентификации» в объекте правильно реализует методы equals() и hashCode().

например. Если ваш класс:

public class YourObject {
    private String identifyingField;

Тогда:

Map<String, YourObject> yourMap = new HashMap<String, YourObject>();
0 голосов
/ 27 октября 2011

Вы всегда можете использовать HashMap и добавить поле в качестве ключа (если вы все равно собираетесь сделать его неизменным, я не вижу никаких проблем с этим).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...