2015-04-25 1 views
3

У меня есть некоторые объекты, давайте просто назовите их объектами Person. У меня также есть некоторые другие объекты, которые можно назвать объектами отношений.Как сохранить значение на основе двух объектов в Java?

Я хочу, чтобы иметь возможность назначать объект отношений между двумя объектами Person, но я не совсем уверен, что хороший способ сделать это.

Я думал о том, что я мог бы дать каждому объекту Person идентификатор, а затем создать 2D-массив объектов Relationship, используя идентификатор объекта Person в качестве значений ключа.

Я не уверен, что это лучший подход, хотя массив будет иметь множество нулевых значений везде, где нет связи между двумя объектами Person.

+1

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

+0

Если я правильно понимаю, вы хотите иметь возможность, учитывая двух лиц, узнать, существует ли между ними связь. Создайте класс Key, содержащий два человека или два идентификатора человека, и используйте Map . Убедитесь, что вы правильно используете hashCode() и equals(). –

+0

Если вы открыты для использования сторонних библиотек, то я ** ВЫСОКО ** рекомендую Neo4j. Он отображает этот тип материала с использованием графиков, и вы можете использовать его язык запросов для эффективного разбора по структуре. –

ответ

1

Что вы описали, это три экземпляра: два экземпляра Person и один экземпляр Relationship.

Самый простой подход, в Person классе, позволяют для Relationship экземпляра существовать, и телеграфировать взаимоотношения с Relationship между этими двумя Person с.

class Person { 
    Relationship relationship; 

    public void createRelationship(Person person) { 
     relationship = new Relationship(this, person); 
    } 
} 

Если вы хотите экземпляр Relationship назад, чтобы сохранить в коллекции или массива, вы могли бы изменить, что просто возвращает новый Relationship в результате двух Person с.

class Relationship { 

    public static Relationship createRelationshipFrom(Person firstPerson, Person secondPerson) { 
     return new Relationship(firstPerson, secondPerson); 
    } 
} 
+0

«Если вы хотите, чтобы экземпляр отношения вернулся в коллекцию или массив, вы можете изменить это, чтобы просто вернуть новое отношение в результате двух Лиц». Да, это то, о чем я прошу. Как мне лучше всего это сделать? 2D-массив с ключами, являющимися идентификатором личности? Есть ли какой-либо объект Java, который может использовать два объекта в качестве ключа? – user11406

+0

Вы здесь слишком много. Все, что вам нужно сделать, это сохранить новый экземпляр «Relationship» в результате вызова метода выше. Если вы хотите, чтобы «Лицо» находилось в определенном «Отношении», вам нужно было бы определить метод 'equals' для' Person' и выставить метод 'inRelationship (Person person)' в 'Relationship'. – Makoto

+0

Это плохой стиль ООП! Эти два класса слишком тесно связаны. Класс 'Person' не нуждается в члене' Relationship'. Только «Отношения» должны содержать две ссылки на «Личность». – mike

0

В естественном мире человек может быть частью отношений, но отношения не могут быть частью человека. Поэтому нежелание Relationship в качестве члена Person. Такая установка предотвращает Person от необходимости более одного Relationship :), а также предотвращает Person от отсутствия Relationship :(

Если мы можем определить Relationship как между 2-х человек, и только 2 человека, то один можно настроить будет состоять в том, чтобы класс Relationship содержал 2 Person членов. Если Relationship может быть между 3 и более людьми :), то может оказаться более полезным один член List<Person>.

Я хочу, чтобы иметь возможность назначить объект отношения между объектами два Person

Если вы пытаетесь дискретно спросить совета знакомств, вы пришли в неправильное место.

Edit:

Если вы пытаетесь получить Relationship, что любые данные двух людей, которые участвуют в, создать метод, как этот

public Relationship find(List<Relationship> relationships, Person person1, Person person2) { 
    for (Relationship relationship : relationships) { 
     if (relationship.getPerson1().equals(person1) && relationship.getPerson2().equals(person2) { 
      return relationship; 
     } 
     if (relationship.getPerson1().equals(person2) && relationship.getPerson2().equals(person1) { 
      return relationship; 
     } 
    } 
} 

Если производительность является проблемой, используйте Set<Relationship> и переопределить equals() и hashCode() методов отношений, так что два объекта Relationship объектов, содержащих этих же людей, будут считаться равными. Тогда вы можете это сделать

Set<Relationship> relationships = new HashSet<Relationship>(); 
// populate relationships 

Relationship delegate = new Relationship(person1, person2); 
int hasRelationship = relationships.contains(delegate); 
+0

Спасибо за ответ. Я понимаю, как хранить отношения. Я просто смущен тем, как наилучшим образом получить его после его создания. Я бы использовал 2D-массив Person или что-то еще? Какими были бы ключи, объекты? – user11406

+0

@ user11406 Это зависит. Как вы хотите получить его? Вы хотите получить список «Отношения», в котором участвует «Личность»? 'Map >' будет работать. Вы хотите перечислить людей, вовлеченных во все отношения? Просто используйте 'List '. Все зависит от того, как вы планируете использовать эту информацию. – pathfinderelite

+0

Ничего. У меня двое, и я хочу получить их отношения. Я хочу что-то вроде: отношения = отношения [person1] [person2]; Я просто сомневаюсь, что использование 2D-массива будет хорошим подходом, и я даже не уверен, как создать 2D-массив ArrayList. Плюс, даже если я сделаю это либо из этих способов, мне нужно будет назначить идентификатор для каждого Лица, который будет использоваться в качестве ключа. – user11406

2

@ Макото - хорошая идея. В качестве альтернативы, то, что кажется мне более естественным, заключается в том, что у объекта Relationship есть два объекта Person, переданные, например.как аргументы конструктора. Затем вам нужно будет отслеживать только объекты «Отношения», потому что они будут знать об обоих Лицах, которые являются его частями.

class Relationship { 
Person firstPerson; 
Person secondPerson; 

    public Relationship(Person firstPerson, Person secondPerson) { 
    this.firstPerson = firstPerson; 
    this.secondPerson = secondPerson; 
} 

В качестве альтернативы вы можете использовать публичный метод передать ссылку на объекты Person, если вы не хотите, чтобы они передаются через конструктор:

public void setPersons(Person firstPerson, Person secondPerson) { 
    this.firstPerson = firstPerson; 
    this.secondPerson = secondPerson; 
} 
0

Что вам нужно, это реализация Tree в Java, где узлами являются объекты Person, а ребра (линии, соединяющие два узла) - это соединения. Это наиболее эффективная модель данных, доступная для типа требуемого хранилища.

Кто-то отправил базовую структуру класса дерева на SO в прошлом:. Java tree data-structure?

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