diff --git a/homeWork2.iml b/homeWork2.iml
new file mode 100644
index 000000000..c90834f2d
--- /dev/null
+++ b/homeWork2.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/out/production/homeWork2/ru/gb/FamilyTree/Main.class b/out/production/homeWork2/ru/gb/FamilyTree/Main.class
new file mode 100644
index 000000000..088362eac
Binary files /dev/null and b/out/production/homeWork2/ru/gb/FamilyTree/Main.class differ
diff --git a/out/production/homeWork2/ru/gb/FamilyTree/family_tree/FamilyTree.class b/out/production/homeWork2/ru/gb/FamilyTree/family_tree/FamilyTree.class
new file mode 100644
index 000000000..4afd46399
Binary files /dev/null and b/out/production/homeWork2/ru/gb/FamilyTree/family_tree/FamilyTree.class differ
diff --git a/out/production/homeWork2/ru/gb/FamilyTree/person/Gender.class b/out/production/homeWork2/ru/gb/FamilyTree/person/Gender.class
new file mode 100644
index 000000000..7c0c01db6
Binary files /dev/null and b/out/production/homeWork2/ru/gb/FamilyTree/person/Gender.class differ
diff --git a/out/production/homeWork2/ru/gb/FamilyTree/person/Person.class b/out/production/homeWork2/ru/gb/FamilyTree/person/Person.class
new file mode 100644
index 000000000..7b02fd9ae
Binary files /dev/null and b/out/production/homeWork2/ru/gb/FamilyTree/person/Person.class differ
diff --git a/src/Test.java b/src/Test.java
deleted file mode 100644
index a06540728..000000000
--- a/src/Test.java
+++ /dev/null
@@ -1,2 +0,0 @@
-public class Test {
-}
diff --git a/src/ru/gb/FamilyTree/Main.java b/src/ru/gb/FamilyTree/Main.java
new file mode 100644
index 000000000..8c6fee64d
--- /dev/null
+++ b/src/ru/gb/FamilyTree/Main.java
@@ -0,0 +1,46 @@
+package ru.gb.FamilyTree;
+
+import ru.gb.FamilyTree.family_tree.FamilyTree;
+import ru.gb.FamilyTree.person.Gender;
+import ru.gb.FamilyTree.person.Person;
+
+import java.time.LocalDate;
+
+public class Main {
+
+ public static void main(String[] args) {
+ FamilyTree ft = new FamilyTree();
+
+ Person ivan = new Person("Иванов", "Иван", Gender.Male, LocalDate.parse("1989-10-31"));
+ Person petr = new Person("Иванов", "Петр", Gender.Male, LocalDate.parse("1962-05-15"));
+ Person anna = new Person("Смирнова", "Анна", Gender.Female, LocalDate.parse("1964-06-28"));
+ Person ekaterina = new Person("Иванова", "Екатерина", Gender.Female, LocalDate.parse("1991-11-02"), petr, anna);
+
+ ft.addPerson(petr);
+ ft.addPerson(anna);
+ ft.setAddSpouses(petr, anna);
+
+ ft.addPerson(ivan);
+ ivan.setFather(petr);
+ ivan.setMother(anna);
+
+ petr.addChild(ivan);
+ anna.addChild(ivan);
+
+ ft.addPerson(ekaterina);
+
+ Person sveta = new Person("Волкова", "Светлана", Gender.Female, LocalDate.parse("1990-02-21"));
+
+ ft.addPerson(sveta);
+ ft.setAddSpouses(ivan, sveta);
+
+ Person gleb = new Person("Иванов", "Глеб", Gender.Male, LocalDate.parse("2017-11-01"), ivan,sveta);
+
+ ft.addPerson(gleb);
+
+
+ System.out.println(ft);
+
+ }
+
+}
diff --git a/src/ru/gb/FamilyTree/family_tree/FamilyTree.java b/src/ru/gb/FamilyTree/family_tree/FamilyTree.java
new file mode 100644
index 000000000..e38014983
--- /dev/null
+++ b/src/ru/gb/FamilyTree/family_tree/FamilyTree.java
@@ -0,0 +1,196 @@
+package ru.gb.FamilyTree.family_tree;
+
+import ru.gb.FamilyTree.person.Gender;
+import ru.gb.FamilyTree.person.Person;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class FamilyTree {
+// private String nameTree;
+ private long personId;
+ private final List familyMembersList;
+
+ public FamilyTree() {
+ familyMembersList = new ArrayList<>();
+ }
+
+ public FamilyTree(List familyMembersList) {
+ this.familyMembersList = familyMembersList;
+ }
+
+ public boolean addPerson(Person person) {
+ if (person == null) {
+ return false;
+ }
+ if (!familyMembersList.contains(person)) {
+ familyMembersList.add(person);
+ person.setId(personId++);
+
+ addToParents(person);
+ addToChildren(person);
+ return true;
+ }
+ return false;
+ }
+
+ private void addToParents(Person person) {
+ for (Person parent: person.getParents()) {
+ parent.addChild(person);
+ }
+ }
+
+ private void addToChildren(Person person) {
+ for (Person child: person.getChildren()) {
+ if (person.getGender().equals(Gender.Male.toString())) {
+ child.setFather(person);
+ } else if (person.getGender().equals(Gender.Female.toString())) {
+ child.setMother(person);
+ }
+ }
+ }
+
+ public List getSiblings(long personId) {
+ Person person = getById(personId);
+ if (person == null) {
+ return null;
+ }
+ List siblings = new ArrayList<>();
+ for (Person parent: person.getParents()) {
+ for (Person child: parent.getChildren()) {
+ if (!child.equals(person)) {
+ siblings.add(child);
+ }
+ }
+ }
+ return siblings;
+ }
+
+ public Person getById(long personId) {
+ for (Person person: familyMembersList) {
+ if (person.getId() == personId) {
+ return person;
+ }
+ }
+ return null;
+ }
+
+ public List getByName(String name) {
+ List persons = new ArrayList<>();
+ for (Person person: familyMembersList) {
+ if (person.getName().equals(name)) {
+ persons.add(person);
+ }
+ }
+ return persons;
+ }
+
+ public boolean setAddSpouses(long personId1, long personId2) {
+ if (checkId(personId1) && checkId(personId2)) {
+ Person person1 = getById(personId1);
+ Person person2 = getById(personId2);
+ setAddSpouses(person1, person2);
+ return true;
+ }
+ return false;
+ }
+
+ public boolean setAddSpouses(Person person1, Person person2) {
+ if (person1 != null && person2 != null) {
+ person1.setSpouse(person2);
+ person2.setSpouse(person1);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean removeSpouses(Person person1, Person person2) {
+ if (person1 != null && person2 != null) {
+ person1.setSpouse(null);
+ person2.setSpouse(null);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean removeSpouses(long personId1, long personId2) {
+ if (checkId(personId1) && checkId(personId2)) {
+ Person person1 = getById(personId1);
+ Person person2 = getById(personId2);
+ removeSpouses(person1, person2);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean remove(long personId) {
+ if (checkId(personId)) {
+ Person person = getById(personId);
+ return familyMembersList.remove(person);
+ }
+ return false;
+ }
+
+ private boolean checkId(long id) {
+ return id < personId && id >=0;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Количество членов семьи: ").append(familyMembersList.size()).append("\n");
+ for (Person person: familyMembersList) {
+ sb.append(person.toString()).append("\n");
+ }
+ return sb.toString();
+ }
+
+
+
+// public String showAllFamilyMembers() {
+// StringBuilder sb = new StringBuilder();
+// for (Person person : familyMembersList) {
+// sb.append(person.toString()).append("\n");
+// }
+// return sb.toString();
+// }
+//
+// public List getFamilyMembers() {
+// return familyMembersList;
+// }
+//
+// public Person getFamilyMember(String name) {
+// for (Person person : familyMembersList) {
+// if (person.getName().equals(name)) {
+// return person;
+// }
+// }
+// return null;
+// }
+//
+// public void setFatherForPerson(Person father, Person child) {
+// if (father != child) {
+// if (father.getGender().equals("Male")) {
+// if (father.getAge() - child.getAge() >= 16) {
+// father.addChild(child);
+// child.setFather(father);
+// System.out.println("Добавлена связь: " + father + " отец -> " + child);
+// if (!familyMembersList.contains(father)) {
+// familyMembersList.add(father);
+// }
+// if (!familyMembersList.contains(child)) {
+// familyMembersList.add(child);
+// }
+// } else {
+// System.out.println("Маленькая разница в возрасте. Не могут быть отцом и ребенком");
+// }
+// } else {
+// System.out.println("Отец должен быть мужчиной");
+// }
+//
+// }
+// }
+}
diff --git a/src/ru/gb/FamilyTree/person/Gender.java b/src/ru/gb/FamilyTree/person/Gender.java
new file mode 100644
index 000000000..9d405741a
--- /dev/null
+++ b/src/ru/gb/FamilyTree/person/Gender.java
@@ -0,0 +1,5 @@
+package ru.gb.FamilyTree.person;
+
+public enum Gender {
+ Male, Female
+}
diff --git a/src/ru/gb/FamilyTree/person/Person.java b/src/ru/gb/FamilyTree/person/Person.java
new file mode 100644
index 000000000..9529df0b6
--- /dev/null
+++ b/src/ru/gb/FamilyTree/person/Person.java
@@ -0,0 +1,217 @@
+package ru.gb.FamilyTree.person;
+
+import java.time.LocalDate;
+import java.time.Period;
+import java.util.ArrayList;
+import java.util.Objects;
+
+public class Person {
+ private long id;
+ private String name, surname, patronymicName; // Имя, Фамилия, Отчество (задается, когда устанавливается отец)
+ private LocalDate dateOfBirth, dateOfDeath; // Даты рождения и смерти
+ private Person father, mother; // Отец и мать
+ private ArrayList children; //Массив с детьми
+ private Gender gender; // Пол
+ private Person spouse;
+// private int age; // Возраст
+
+ public Person(String surname, String name, Gender gender, LocalDate dateOfBirth, LocalDate dateOfDeath, Person father, Person mother) {
+ id = -1;
+ this.surname = surname;
+ this.name = name;
+ this.dateOfBirth = dateOfBirth;
+ this.gender = gender;
+ this.dateOfDeath = dateOfDeath;
+ this.father = father;
+ this.mother = mother;
+ children = new ArrayList<>();
+ }
+
+ public Person(String surname, String name, Gender gender, LocalDate dateOfBirth) {
+ this(surname, name, gender, dateOfBirth, null, null, null);
+ }
+
+ public Person(String surname, String name, Gender gender, LocalDate dateOfBirth, Person father, Person mother) {
+ this(surname, name, gender, dateOfBirth, null, father, mother);
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getSurname() {
+ return surname;
+ }
+
+ public String getGender() {
+ return gender.toString();
+ }
+
+ public LocalDate getDateOfDeath() {
+ return dateOfDeath;
+ }
+
+ public LocalDate getDateOfBirth() {
+ return dateOfBirth;
+ }
+
+ public void setDateOfDeath(LocalDate dateOfDeath) {
+ this.dateOfDeath = dateOfDeath;
+ }
+
+ public Person getSpouse() {
+ return spouse;
+ }
+
+ public void setSpouse(Person spouse) {
+ this.spouse = spouse;
+ }
+
+ public int getAge() {
+ return getPeriod(dateOfBirth, Objects.requireNonNullElseGet(dateOfDeath, LocalDate::now));
+ }
+
+ private int getPeriod(LocalDate dateOfBirth, LocalDate dateOfDeath) {
+ Period diff = Period.between(dateOfBirth, dateOfDeath);
+ return diff.getYears();
+ }
+
+ public Person getFather() {
+ return father;
+ }
+
+ public void setFather(Person father) {
+ this.father = father;
+ }
+
+ public Person getMother() {
+ return mother;
+ }
+
+ public void setMother(Person mother) {
+ this.mother = mother;
+ }
+
+ public ArrayList getParents() {
+ ArrayList parents = new ArrayList<>();
+ if (this.getFather() != null) {
+ parents.add(this.getFather());
+ }
+ if (this.getMother() != null) {
+ parents.add(this.getMother());
+ }
+ return parents;
+ }
+
+ public String getPatronymicName() {
+ return patronymicName;
+ }
+
+ public boolean addChild(Person child) {
+ if (!children.contains(child)) {
+ children.add(child);
+ return true;
+ }
+ return false;
+
+ }
+
+ public ArrayList getChildren() {
+ return children;
+ }
+
+ @Override
+ public String toString() {
+ return getInfo();
+ }
+
+ public String getInfo() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("id: ");
+ sb.append(id);
+ sb.append(", имя: ");
+ sb.append(name);
+ sb.append(", фамилия: ");
+ sb.append(surname);
+ sb.append(", возраст: ");
+ sb.append(getAge());
+ sb.append(", ");
+ sb.append(getFatherInfo());
+ sb.append(", ");
+ sb.append(getMotherInfo());
+ sb.append(", ");
+ sb.append(getChildrenInfo());
+ sb.append(", ");
+ sb.append(getSpounseInfo());
+ return sb.toString();
+
+ }
+
+ public String getSpounseInfo() {
+ String info = "супруг(а): ";
+ Person spouse = getSpouse();
+ if (spouse == null) {
+ info += "нет.";
+ } else {
+ info += spouse.getName();
+ }
+ return info;
+ }
+
+ public String getFatherInfo() {
+ String info = "отец: ";
+ Person father = getFather();
+ if (father == null) {
+ info += "не известен";
+ } else {
+ info += father.getName();
+ }
+ return info;
+ }
+
+ public String getMotherInfo() {
+ String info = "мать: ";
+ Person mother = getMother();
+ if (mother == null) {
+ info += "не известна.";
+ } else {
+ info += mother.getName();
+ }
+ return info;
+ }
+
+ public String getChildrenInfo() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("дети: ");
+ if (!children.isEmpty()) {
+ sb.append(children.getFirst().getName());
+ for (int i = 1; i < children.size(); i++) {
+ sb.append(", ");
+ sb.append(children.get(i).getName());
+ }
+ } else {
+ sb.append("отсутствуют");
+ }
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof Person)) {
+ return false;
+ }
+ Person other = (Person) obj;
+ return other.getId() == this.getId();
+ }
+}