Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

6381_OOP_Kulikova Polina`s family tree #35

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions src/ru/gb/family_tree/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/**
* Реализовать, с учетом ооп подхода, приложение.
* Для проведения исследований с генеалогическим древом.
* Идея: описать некоторое количество компонент, например:
* модель человека и дерева
* Под “проведением исследования” можно понимать например получение всех детей выбранного человека.
* Более детальное описание проекта и как его реализовать обсуждали в конце семинара
* Сделать PR к проекту: https://github.com/Liberate520/homeWork
* В качестве ответа указать ссылку на PR
* Ссылка на то как сделать пулреквест смотри в материалах к уроку
* Если PR все таки не дается, то можно и ссылкой на гит репозиторий
* Дополнить проект методами записи в файл и чтения из файла.
* Для этого создать отдельный класс и реализовать в нем нужные методы.
* Для данного класса сделайте интерфейс, который и используйте в своей программе.
* Пример работы с интерфейсом Serialazable можно найти в материалах к уроку.
* Изменить древо, сделать класс параметизированным,
* чтобы условно дерево можно было использовать не только
* для людей, но и сделать родословную для собак (класс собак
* создавать не надо или создать, но за пределами пакета проекта).
* Продумать (только подумать, но можно и попробовать реализовать)
* класс общения с пользователем, набор команд, для операций над деревом
*/

package ru.gb.family_tree;

import ru.gb.family_tree.model.family_tree.FamilyTree;
import ru.gb.family_tree.model.human.Gender;
import ru.gb.family_tree.model.human.Human;
import ru.gb.family_tree.model.writer.FileHandler;

import java.time.LocalDate;

public class Main {
final static String filePath = "src/ru/gb/family_tree/writer/tree.txt";
public static void main(String[] args) {

// FamilyTree tree = load();
FamilyTree tree = testTree();
save(tree);

System.out.println(tree);
}

private static FamilyTree load() {
FileHandler fileHandler = new FileHandler();
fileHandler.setPath(filePath);
return (FamilyTree) fileHandler.read();
}

public static void save(FamilyTree familyTree) {
FileHandler fileHandler = new FileHandler();
fileHandler.setPath(filePath);
fileHandler.save(familyTree);
}

private static FamilyTree testTree() {
FamilyTree tree = new FamilyTree();

Human sveta = new Human("Светлана", Gender.Female, LocalDate.of(1956, 2, 12), LocalDate.of(2023, 1, 14));
Human vova1 = new Human("Владимир", Gender.Male, LocalDate.of(1954, 10, 23));

tree.add(sveta);
tree.add(vova1);
// tree.setWeddings(sveta, vova1);

Human stepan = new Human("Степан", Gender.Male, LocalDate.of(1991, 12, 1), vova1, sveta);
Human polina = new Human("Полина", Gender.Female, LocalDate.of(1983, 9, 28), vova1, sveta);
Human vova2 = new Human("Владимир", Gender.Male, LocalDate.of(1996, 3, 1), vova1, sveta);

tree.add(stepan);
tree.add(polina);
tree.add(vova2);

return tree;
}
}
162 changes: 162 additions & 0 deletions src/ru/gb/family_tree/model/family_tree/FamilyTree.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
package ru.gb.family_tree.model.family_tree;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class FamilyTree<E extends TreeNode<E>> implements Serializable, Iterable<E> {
private long humansId;
private List<E> humanList;

public FamilyTree() {
this(new ArrayList<>());
}

public FamilyTree(List<E> humanList) {
this.humanList = humanList;
}

public boolean add(E human) {
if (human == null) {
return false;
}
if (!humanList.contains(human)) {
humanList.add(human);
human.setId(humansId++);

addToParents(human);
addChildren(human);

return true;
}
return false;
}

private void addToParents(E human) {
for (E parent : human.getParents()) {
parent.addChild(human);
}
}

private void addChildren(E human) {
for (E child : human.getChildren()) {
child.addParent(human);
}
}

public List<E> getSiblings(int id) {
E human = getById(id);
if (human == null) {
return null;
}
List<E> res = new ArrayList<>();
for (E parent : human.getParents()) {
for (E child : parent.getChildren()) {
if (!child.equals(human)) {
res.add(child);
}
}
}
return res;
}

public List<E> getByName(String name) {
List<E> res = new ArrayList<>();
for (E human : humanList) {
if (human.getName().equals(name)) {
res.add(human);
}
}
return res;
}

public boolean setWeddings(long humansId1, long humansId2) {
if (checkId(humansId1) && checkId(humansId2)) {
E human1 = getById(humansId1);
E human2 = getById(humansId2);
return setWeddings(human1, human2);
}
return false;
}

public boolean setWeddings(E human1, E human2) {
if (human1.getSpouse() == null && human2.getSpouse() == null) {
human1.getSpouse(human2);
human2.getSpouse(human1);
return true;
} else {
return false;
}
}

public boolean setDivorce(long humansId1, long humansId2) {
if (checkId(humansId1) && checkId(humansId2)) {
E human1 = getById(humansId1);
E human2 = getById(humansId2);
return setDivorce(human1, human2);
}
return false;
}

public boolean setDivorce(E human1, E human2) {
if (human1.getSpouse() != null && human2.getSpouse() != null) {
human1.getSpouse(null);
human2.getSpouse(null);
return true;
} else {
return false;
}
}

public boolean remove(long humansId) {
if (checkId(humansId)) {
E human = getById(humansId);
return humanList.remove(human);
}
return false;
}

public boolean checkId(long id) {
return id < humansId && id >= 0;
}

public E getById(long id) {
for (E human : humanList) {
if (human.getId() == id) {
return human;
}
}
return null;
}

@Override
public String toString() {
return getInfo();
}

public String getInfo() {
StringBuilder sb = new StringBuilder();
sb.append("В дереве ");
sb.append(humanList.size());
sb.append(" объектов: \n");
for (E human : humanList) {
sb.append(human);
sb.append("\n");
}
return sb.toString();
}

@Override
public Iterator<E> iterator() {
return new FamilyTreeIterator(humanList);
}

public void sortByName() {
humanList.sort(new FamilyTreeComparatorByName());
}

public void sortByBirthDate() {
humanList.sort(new FamilyTreeComparatorByBirthDate());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package ru.gb.family_tree.model.family_tree;

import java.util.Comparator;

public class FamilyTreeComparatorByBirthDate<T extends TreeNode<T>> implements Comparator<T> {
@Override
public int compare(T o1, T o2) {
return o1.getBirthDate().compareTo(o2.getBirthDate());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package ru.gb.family_tree.model.family_tree;

import java.util.Comparator;

public class FamilyTreeComparatorByName<T extends TreeNode<T>> implements Comparator<T> {
@Override
public int compare(T o1, T o2) {
return o1.getName().compareTo(o2.getName());
}
}
24 changes: 24 additions & 0 deletions src/ru/gb/family_tree/model/family_tree/FamilyTreeIterator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package ru.gb.family_tree.model.family_tree;

import java.util.Iterator;
import java.util.List;

public class FamilyTreeIterator<T extends TreeNode<T>> implements Iterator<T> {
private List<T> list;
private int index;

public FamilyTreeIterator(List<T> list) {
this.list = list;
index = 0;
}

@Override
public boolean hasNext() {
return index < list.size();
}

@Override
public T next() {
return list.get(index++);
}
}
21 changes: 21 additions & 0 deletions src/ru/gb/family_tree/model/family_tree/TreeNode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ru.gb.family_tree.model.family_tree;

import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;

public interface TreeNode<T> extends Serializable {
void setId(long id);
long getId();
T getFather();
T getMother();
boolean addChild(T human);
boolean addParent(T human);
String getName();
LocalDate getDeathDate();
LocalDate getBirthDate();
List<T> getParents();
List<T> getChildren();
T getSpouse();
void setSpouse();
}
5 changes: 5 additions & 0 deletions src/ru/gb/family_tree/model/human/Gender.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.gb.family_tree.model.human;

public enum Gender {
Male, Female
}
Loading