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(); + } +}