2013-06-03 1 views
13

В чем разница между Pair Class and a HashMap. Я вижу, что они оба имеют key and value.Что такое использование класса Pair и почему здесь реализовано?

Код Ранее:

List<Patient> patientDetails = new ArrayList<Patient>(); 
Patient patientInfo = new Patient(); 
patientInfo.setReligion(Constants.ReligionArray[custom.getReligion()]); 
patientDetails.add(patientInfo); 

код был изменен на это сегодня.

Изменен код

List<Pair<String, String>> patientInfo = new ArrayList<Pair<String, String>>(); 
patientInfo.add(new Pair<String, String>("Religion", Constants.ReligionArray[custom.getReligion()])); 
  1. Почему они реализовали Pair Class here? Что может быть причиной.
  2. В чем разница между Pair Class and a HashMap.

Примечание: Оба кода работают отлично.

+0

Почему? Наверное, потому, что хранить все о пациенте в одном объекте - это не очень хорошая идея, для безопасности и в противном случае. Таким образом, вы можете абстрагироваться от доступа к информации о пациентах. – arynaq

+1

Я полагаю, вы не знаете о структуре данных хеш-таблицы, правильно? – acdcjunior

ответ

2

Прежде чем говорить о разнице между парой и HashMap, позвольте мне рассказать вам, почему на самом деле вы не отвечаете на этот вопрос. То, что вы действительно хотите знать, - это то, почему вы возьмете объект и разделите его на список примитивов key/value.

Код, который вы ссылаетесь, преобразование из объектно-ориентированного подхода с использованием класса Patient (который на самом деле выглядит, как он должен называться PatientInfo) в список примитивов, они essentialy «deObjectOrienting» класс.

Таким образом, в своей модели каждая переменная класса становится Pair, где имя переменной становится ключом, а значение переменной становится значением.

Вот растянутый пример класс

// Old style (Object oriented) 
class PatientInfo{ 
    String religion; 
    String address; 
} 
PatientInfo patientInfo = new PatientInfo(); 
patientInfo.setReligion("myReligionName"); 
patientInfo.setAddress("address of the patient"); 

// New Style, key/value primitive pairs (very not object oriented) 
Pair<String,String> religionInfo = new Pair<String,String>("religion","myReligionName"); 
Pair<String,String> addressInfo = new Pair<String,String>("address","address of the patient"); 

Затем они добавляют их либо Patient или Pair в список.

Почему кто-то делает это, это хороший вопрос. Большинство людей стараются стать более объектно ориентированными, поскольку упрощают кодирование. Возможно, поскольку в Clss только одна переменная, они поняли, почему бы не полностью удалить класс?

К вашему оригинальному вопросу между парой и HashMap. Пара - это просто ключ/ценность. HashMap - это коллекция, обычно используемая для хранения многих пар ключ/значение. Здесь они используют список, где они должны, вероятно, использовать HashMap.

0

A Pair объект хранит ровно один ключ и одно значение. A HashMap - это структура, в которой вы можете хранить несколько пар ключ/значение.

+0

На самом деле, 'HashMap' является' Map', а не 'Collection'. – Genzer

+0

Вы правы, я исправил свой ответ. – eternay

+0

С дженериками пара имела бы смысл. –

0

«Пара» - это пара предметов, которые вы хотите каким-то образом связать. Нет ключевых правил, списков предметов или чего-либо еще. Это просто ярлык, когда у вас есть пара предметов, которые действительно наиболее полезны в качестве пары элементов, но достаточно простая структура, где нет необходимости создавать отдельный класс, чтобы связать их. Примеры: точки на прямоугольнике, IP-адреса в доменах и т. Д.

Хешмап можно рассматривать как сопоставление пар с соблюдением «ключевой» спецификации. В этом случае первый элемент пары становится «константой» и используется для обозначения второго элемента. В моем примере пар я использовал ip-адреса для доменов. В этом случае мы будем использовать домен как «ключ» и использовать его для ссылки на IP-адрес машины. Этот IP-адрес, конечно, может измениться, но домен всегда будет одним и тем же и будет использоваться для быстрого поиска текущего связанного ip-адреса. Обратите внимание, что ограничение первого элемента в паре, являющейся «ключом», исходит из хэш-карты, а не спецификация пары istelf. Хэш-часть hashmap затем ссылается на то, как элементы просматриваются, в этом случае хеш-таблица, на «первом» элементе в паре ...

7

Фактически, ваш код был изменен от обычного подхода Java в что чаще всего называют «отрицанием объекта». Замена произошла от выделенного объекта домена Patient в общий Pair<String, String>.

Так вы спрашиваете о разнице между List<Pair<String,String>> и Map<String,String>. Первая содержит больше информации, поскольку она поддерживает порядок вставки отдельных пар, а также позволяет произвольный доступ на основе позиции в списке.

A Map, с другой стороны, позволяет эффективно искать на основе ключа, что действительно необходимо.

7
  1. Pair класс это просто структура с двумя полями, которые не имеют специальное название (в отличие от Person). Пары (и, в более общем плане, кортежи) часто используются в таких языках, как Python, когда вы не хотите указывать имя какой-либо промежуточной структуре. В вашем случае вместо (возможно) недоопределенного объекта Person у вас есть простой полностью определенный объект.Возможно, использование Pair сомнительно в Java, потому что довольно неуклюжий синтаксис (сравните с Python, где пара будет всего ("Religion", religions)).

  2. Вы можете представить Map как набор пар с уникальным ограничением на первый элемент.

6

Я думаю, что этот вопрос вы спрашиваете: что разница между List<Pair<T,S>> и HashMap<T,S>. Здесь очень много.

В целом, a Map объект используется для связывания значения с ключом и обеспечивает средство для быстрого получения значений на основе ключа. Обычно может быть одно значение, связанное с одним ключом.

A List - это упорядоченный контейнер, в котором хранятся объекты, предоставляет средства для итерации по его содержимому и получения элемента на основе его местоположения в списке (получить элемент Nth). Обычно одни и те же элементы могут дублироваться в списке.

В вашем случае, когда вы используете список, ваши пациенты могут иметь несколько религий. Чтобы узнать, какую религию имеет ваш пациент, вам необходимо вручную найти список для пары с первым элементом, установленным в религии.

Если бы вы использовали карту, у каждого пациента была бы единственная религия, связанная с ним (или нет). Вы также можете быстро найти религию через Map<String,String>.get(String key)

+0

Модель, которая поддерживает несколько религий на человека --- какая отличная идея научить значению * overengineering *! –

+0

@MarkoTopolnik, это неудачный пример, извините:/Но я думаю, что сохранение телефонных номеров или других 1-многих объектов - это возможность в «patientDetails». – Dariusz

+0

Я забыл поставить смайлик, извините :-) Я написал это для смеха. –

1

Класс Pair можно сравнить с Map.Entry HashMap. HashMap может содержать несколько пар ключ/значение, хранящихся и эффективно проверенных ключом.

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

Смежные вопросы