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

add basic family tree #1

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
14 changes: 14 additions & 0 deletions src/ru/gb/family_tree/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ru.gb.family_tree;

import ru.gb.family_tree.model.tree_elements.Item;
import ru.gb.family_tree.service.handler.FileHandler;
import ru.gb.family_tree.service.tree_service.TreeService;
import ru.gb.family_tree.viewer.BaseTerminal;

public class Main {
public static void main(String[] args) {

BaseTerminal<TreeService<Item>> bt = new BaseTerminal<>(new FileHandler("data.txt"));
bt.start();
}
}
45 changes: 45 additions & 0 deletions src/ru/gb/family_tree/model/tree/FamilyTree.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package ru.gb.family_tree.model.tree;

import ru.gb.family_tree.model.tree_elements.Fundamental;
import ru.gb.family_tree.model.tree_elements.Item;

import java.io.Serializable;
import java.util.*;

public class FamilyTree<E extends Fundamental<E>> implements Serializable, Iterable<E> {

private long treeId;
private long elementId;
private List<E> elementList;

public FamilyTree() {
this.treeId = new Random().nextInt(10000);
this.elementList = new ArrayList<>();
System.out.println("Зарегистрировано семейно древо: " + this.treeId);
}

public long getElementId() {
return elementId;
}

public void setElementId(long elementId) {
this.elementId = elementId;
}

public List<E> getElementList() {
return elementList;
}

@Override
public String toString() {
return "FamilyTree{" +
"treeId=" + treeId +
'}';
}

@Override
public Iterator<E> iterator() {
FamilyTreeIterator<E> fi = new FamilyTreeIterator<>(elementList);
return fi;
}
}
23 changes: 23 additions & 0 deletions src/ru/gb/family_tree/model/tree/FamilyTreeIterator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ru.gb.family_tree.model.tree;

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

public class FamilyTreeIterator<E> implements Iterator<E>{
private List<E> elementList;
private int index;

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

@Override
public boolean hasNext() {
return elementList.size() > index;
}

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

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

public interface Fundamental<E> {

long getId();
void setId(long id);
String getName();
E getSpouse();
void setSpouse(E fundamental);
List<E> getParents();
void setParents(List<E> parents);
List<E> getChildren();
void setChildren(List<E> children);
LocalDate getBirthday();
}
5 changes: 5 additions & 0 deletions src/ru/gb/family_tree/model/tree_elements/Gender.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.gb.family_tree.model.tree_elements;

public enum Gender {
Male, Female
}
116 changes: 116 additions & 0 deletions src/ru/gb/family_tree/model/tree_elements/Item.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package ru.gb.family_tree.model.tree_elements;

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

public class Item implements Fundamental<Item>, Serializable {
private long id;
private String name;
private String surname;
private LocalDate birthday;
private Gender gender;
private Item spouse;
private List<Item> parents;
private List<Item> children;

public Item(String name, String surname, LocalDate birthday, Gender gender) {
this.name = name;
this.surname = surname;
this.birthday = birthday;
this.gender = gender;
this.children = new ArrayList<>();
this.parents = new ArrayList<>();
}

@Override
public long getId() {
return id;
}

@Override
public void setId(long id) {
this.id = id;
}

@Override
public String getName() {
StringBuilder sb = new StringBuilder();
sb.append(name);
sb.append(" ");
sb.append(surname);
return sb.toString();
}

@Override
public List<Item> getParents() {
return parents;
}

@Override
public void setParents(List<Item> parents) {
this.parents = parents;
}

@Override
public void setChildren(List<Item> children) {
this.children = children;
}

@Override
public List<Item> getChildren() {
return children;
}

@Override
public Item getSpouse() {
return spouse;
}

@Override
public void setSpouse(Item spouse) {
this.spouse = spouse;
}

@Override
public LocalDate getBirthday() {
return birthday;
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Член семьи " +
"№ = " + id +
", Имя -> " + name +
", Фамилия -> " + surname +
", дата рождения -> " + birthday);
if (spouse != null) {
sb.append(", супруг(-а) -> " + spouse.getName());
} else {
sb.append(", не в браке");
}
if (parents.size() != 0) {
sb.append(", родители ->");
parents.stream().forEach(h -> sb.append(" член семьи № " + h.getId()));
} else {
sb.append(", нет данных о родителях");
}
if (children.size() != 0) {
sb.append(", дети ->");
children.stream().forEach(h -> sb.append(" член семьи № " + h.getId()));
} else {
sb.append(", нет данных о детях");
}
return sb.toString();
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Item)) return false;
Item human = (Item) o;
return getId() == human.getId();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package ru.gb.family_tree.model.tree_elements.comparator;

import ru.gb.family_tree.model.tree_elements.Fundamental;
import ru.gb.family_tree.model.tree_elements.Item;

import java.util.Comparator;

public class ElementsComparatorByBirthday<E extends Fundamental<E>> implements Comparator<E> {

@Override
public int compare(E o1, E o2) {
if (o1.getBirthday().isAfter(o2.getBirthday())) {
return 1;
} else if (o1.getBirthday().isBefore(o2.getBirthday())) {
return -1;
} else {
return 0;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ru.gb.family_tree.model.tree_elements.comparator;

import ru.gb.family_tree.model.tree_elements.Fundamental;
import ru.gb.family_tree.model.tree_elements.Item;

import java.util.Comparator;

public class ElementsComparatorByChildren<E extends Fundamental<E>> implements Comparator<E> {

@Override
public int compare(E o1, E o2) {
return Integer.compare(o2.getChildren().size(), o1.getChildren().size());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ru.gb.family_tree.model.tree_elements.comparator;

import ru.gb.family_tree.model.tree_elements.Fundamental;
import ru.gb.family_tree.model.tree_elements.Item;

import java.util.Comparator;

public class ElementsComparatorByName<E extends Fundamental<E>> implements Comparator<E> {
@Override
public int compare(E o1, E o2) {
return o1.getName().compareTo(o2.getName());
}
}
35 changes: 35 additions & 0 deletions src/ru/gb/family_tree/service/handler/FileHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package ru.gb.family_tree.service.handler;

import ru.gb.family_tree.model.tree.FamilyTree;

import java.io.*;

public class FileHandler implements Writable {
private String path;

public FileHandler(String path) {
this.path = path;
}

@Override
public void save(FamilyTree familyTree) {
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(
new FileOutputStream(path, false))) {
objectOutputStream.writeObject(familyTree);
} catch (IOException e) {
System.out.println(e.getMessage());
}
}

@Override
public FamilyTree read() {
FamilyTree familyTree = null;
try (ObjectInputStream objectInputStream = new ObjectInputStream(
new FileInputStream(path))) {
familyTree = (FamilyTree) objectInputStream.readObject();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return familyTree;
}
}
8 changes: 8 additions & 0 deletions src/ru/gb/family_tree/service/handler/Writable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package ru.gb.family_tree.service.handler;

import ru.gb.family_tree.model.tree.FamilyTree;

public interface Writable {
void save(FamilyTree familyTree);
FamilyTree read();
}
18 changes: 18 additions & 0 deletions src/ru/gb/family_tree/service/tree_service/BaseFunctions.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package ru.gb.family_tree.service.tree_service;

import ru.gb.family_tree.model.tree_elements.Fundamental;

import java.util.List;

public interface BaseFunctions <E extends Fundamental> {

E addElement(E e);
E getElement(long id);
void addParents(long id, List<E> parents);
List<E> getParents(long id);
void addChildren(long id, List<E> children);
List<E> getChildren(long id);
void removeItem(long id);
void addSpouse(long id1, long id2);
void removeSpouse(long id);
}
11 changes: 11 additions & 0 deletions src/ru/gb/family_tree/service/tree_service/SortFunctions.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ru.gb.family_tree.service.tree_service;

import ru.gb.family_tree.model.tree_elements.Fundamental;

import java.util.List;

public interface SortFunctions <E extends Fundamental>{
List<E> SortByName();
List<E> SortByBirthday();
List<E> SortByChildren();
}
Loading