From 82fef0a944c5db5ca3687896881bed6cf1dad7e8 Mon Sep 17 00:00:00 2001 From: Margo Date: Mon, 12 Aug 2024 21:37:30 +0300 Subject: [PATCH 1/7] FamilyTreeHomeWork --- .gitignore | 4 +- src/FamilyTree.java | 79 +++++++++++++++++++++ src/Gender.java | 3 + src/Human.java | 163 ++++++++++++++++++++++++++++++++++++++++++++ src/Main.java | 28 ++++++++ src/Test.java | 2 - 6 files changed, 276 insertions(+), 3 deletions(-) create mode 100644 src/FamilyTree.java create mode 100644 src/Gender.java create mode 100644 src/Human.java create mode 100644 src/Main.java delete mode 100644 src/Test.java diff --git a/.gitignore b/.gitignore index 723ef36f4e..a8ee77e5ac 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -.idea \ No newline at end of file +.idea +homeWork.iml +.out diff --git a/src/FamilyTree.java b/src/FamilyTree.java new file mode 100644 index 0000000000..81c37ef39b --- /dev/null +++ b/src/FamilyTree.java @@ -0,0 +1,79 @@ +import java.util.ArrayList; +import java.util.List; + +public class FamilyTree { + private long humanId; + private List humans; + + public FamilyTree(){ + this(new ArrayList<>()); + } + + public FamilyTree(List humans){ + this.humans = humans; + } + + public boolean add(Human human){ + if (human == null){ + return false; + } + if (!humans.contains(human)){ + humans.add(human); + human.setId(humanId++); + + addToParents(human); + addToChildren(human); + + return true; + } + return false; + } + + private void addToParents(Human human){ + for (Human parent: human.getParents()){ + parent.addChild(human); + } + } + + private void addToChildren(Human human){ + for (Human child: human.getChildren()){ + child.addParent(human); + } + } + + public List getByName(String name){ + List res = new ArrayList<>(); + for (Human human : humans) { + if (human.getName().equals(name)){ + res.add(human); + } + } + return res; + } + + public Human getById(long id){ + for (Human human: humans){ + if (human.getId() == id){ + return human; + } + } + return null; + } + + @Override + public String toString(){ + return getInfo(); + } + public String getInfo() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("В семье "); + stringBuilder.append(humans.size()); + stringBuilder.append(" человек(а) \n"); + for (Human human : humans){ + stringBuilder.append(human); + stringBuilder.append("\n"); + } + return stringBuilder.toString(); + } +} + diff --git a/src/Gender.java b/src/Gender.java new file mode 100644 index 0000000000..d9fcf3ad28 --- /dev/null +++ b/src/Gender.java @@ -0,0 +1,3 @@ +public enum Gender { + Male, Female; +} diff --git a/src/Human.java b/src/Human.java new file mode 100644 index 0000000000..c0cc9264ea --- /dev/null +++ b/src/Human.java @@ -0,0 +1,163 @@ +import java.time.LocalDate; +import java.time.Period; +import java.util.ArrayList; +import java.util.List; + +public class Human { + private long id; + private String name; + private Gender gender; + private LocalDate birthDate; + private LocalDate deathDate; + private List parents; + private List children; + + public Human(String name, LocalDate birthDate, LocalDate deathDate, Gender gender){ + id = -1; + this.name = name; + this.birthDate = birthDate; + this.deathDate = deathDate; + this.gender = gender; + parents = new ArrayList<>(); + children = new ArrayList<>(); + } + + public Human(String name, LocalDate birthDate, Gender gender){ + this(name, birthDate, null, gender); + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public LocalDate getBirthDate() { + return birthDate; + } + + public void setBirthDate(LocalDate birthDate) { + this.birthDate = birthDate; + } + + public LocalDate getDeathDate() { + return deathDate; + } + + public void setDeathDate(LocalDate deathDate) { + this.deathDate = deathDate; + } + + public String getName(){ + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getChildren() { + return children; + } + + public List getParents() { + return parents; + } + + public boolean addChild(Human child){ + if (!children.contains(child)){ + children.add(child); + return true; + } + return false; + } + + public boolean addParent(Human parent){ + if (!parents.contains(parent)){ + parents.add(parent); + return true; + } + return false; + } + + public void setGender(Gender gender){ + this.gender = gender; + } + + public int getAge(){ + if (deathDate == null){ + return getPeriod(birthDate, LocalDate.now()); + }else { + return getPeriod(birthDate, deathDate); + } + } + public int getPeriod(LocalDate birthDate, LocalDate deathDate){ + Period diff = Period.between(birthDate, deathDate); + return diff.getYears(); + } + + public String toString(){ + return getInfo(); + } + + public String getInfo(){ + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("id: "); + stringBuilder.append(id); + stringBuilder.append(", имя: "); + stringBuilder.append(name); + stringBuilder.append(", возраст: "); + stringBuilder.append(getAge()); + stringBuilder.append(", пол: "); + stringBuilder.append(gender); + stringBuilder.append(", "); + stringBuilder.append(getParentsInfo()); + stringBuilder.append(", "); + stringBuilder.append(getChildrenInfo()); + return stringBuilder.toString(); + } + + public String getParentsInfo(){ + StringBuilder par = new StringBuilder(); + par.append("Родители: "); + if (parents.size() != 0){ + par.append(parents.get(0).getName()); + for (int i = 1; i < parents.size(); i++) { + par.append(", "); + par.append(parents.get(i).getName()); + } + }else { + par.append("не известны"); + } + return par.toString(); + } + + public String getChildrenInfo(){ + StringBuilder chil = new StringBuilder(); + chil.append("Дети: "); + if (children.size() != 0){ + chil.append(children.get(0).getName()); + for (int i = 1; i < children.size(); i++) { + chil.append(", "); + chil.append(children.get(i).getName()); + } + }else { + chil.append("отсутствуют"); + } + return chil.toString(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj){ + return true; + } + if (!(obj instanceof Human)){ + return false; + } + Human human = (Human) obj; + return human.getId() == getId(); + } +} diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000000..0d7b973970 --- /dev/null +++ b/src/Main.java @@ -0,0 +1,28 @@ +import java.time.LocalDate; + +public class Main { + public static void main(String[] args) { + FamilyTree tree = testTree(); + + System.out.println(tree); + } + + private static FamilyTree testTree(){ + FamilyTree tree = new FamilyTree(); + + Human human1 = new Human("Ян", LocalDate.of(1977, 8, 30), Gender.Male); + Human human2 = new Human("Светлана", LocalDate.of(1977, 5, 17), Gender.Female); + Human human3 = new Human("Маргарита", LocalDate.of(1997, 2, 16), Gender.Female); + Human human4 = new Human("Нина", LocalDate.of(1949, 5, 11), LocalDate.of(2012, 6, 15), Gender.Female); + human3.addParent(human1); + human3.addParent(human2); + human2.addChild(human3); + human4.addChild(human1); + + tree.add(human1); + tree.add(human2); + tree.add(human3); + tree.add(human4); + return tree; + } +} diff --git a/src/Test.java b/src/Test.java deleted file mode 100644 index a06540728b..0000000000 --- a/src/Test.java +++ /dev/null @@ -1,2 +0,0 @@ -public class Test { -} From 8e39597ff8944a4b4467068325e1d0ac262e60ad Mon Sep 17 00:00:00 2001 From: Margo Date: Wed, 14 Aug 2024 20:28:24 +0300 Subject: [PATCH 2/7] FamilyTreeHomeWork2 --- src/Main.java | 21 +++++++++++- .../family_tree}/FamilyTree.java | 7 +++- src/{ => family_tree/human}/Gender.java | 2 ++ src/{ => family_tree/human}/Human.java | 5 ++- src/family_tree/writer/FileHandler.java | 30 ++++++++++++++++++ src/family_tree/writer/Writer.java | 8 +++++ src/family_tree/writer/tree.txt | Bin 0 -> 833 bytes 7 files changed, 70 insertions(+), 3 deletions(-) rename src/{ => family_tree/family_tree}/FamilyTree.java (92%) rename src/{ => family_tree/human}/Gender.java (59%) rename src/{ => family_tree/human}/Human.java (97%) create mode 100644 src/family_tree/writer/FileHandler.java create mode 100644 src/family_tree/writer/Writer.java create mode 100644 src/family_tree/writer/tree.txt diff --git a/src/Main.java b/src/Main.java index 0d7b973970..49b6ce102e 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,12 +1,31 @@ +import family_tree.family_tree.FamilyTree; +import family_tree.human.Gender; +import family_tree.human.Human; +import family_tree.writer.FileHandler; + import java.time.LocalDate; public class Main { + final static String file = "src/family_tree/writer/tree.txt"; + public static void main(String[] args) { - FamilyTree tree = testTree(); +// FamilyTree tree = testTree(); +// save(tree); + FamilyTree tree = load(); System.out.println(tree); } + private static FamilyTree load(){ + FileHandler fileHandler = new FileHandler(file); + return (FamilyTree) fileHandler.read(); + } + + private static void save(FamilyTree familyTree){ + FileHandler fileHandler = new FileHandler(file); + fileHandler.save(familyTree); + } + private static FamilyTree testTree(){ FamilyTree tree = new FamilyTree(); diff --git a/src/FamilyTree.java b/src/family_tree/family_tree/FamilyTree.java similarity index 92% rename from src/FamilyTree.java rename to src/family_tree/family_tree/FamilyTree.java index 81c37ef39b..0ddaa0bbae 100644 --- a/src/FamilyTree.java +++ b/src/family_tree/family_tree/FamilyTree.java @@ -1,7 +1,12 @@ +package family_tree.family_tree; + +import family_tree.human.Human; + +import java.io.Serializable; import java.util.ArrayList; import java.util.List; -public class FamilyTree { +public class FamilyTree implements Serializable { private long humanId; private List humans; diff --git a/src/Gender.java b/src/family_tree/human/Gender.java similarity index 59% rename from src/Gender.java rename to src/family_tree/human/Gender.java index d9fcf3ad28..7cb9e48e8b 100644 --- a/src/Gender.java +++ b/src/family_tree/human/Gender.java @@ -1,3 +1,5 @@ +package family_tree.human; + public enum Gender { Male, Female; } diff --git a/src/Human.java b/src/family_tree/human/Human.java similarity index 97% rename from src/Human.java rename to src/family_tree/human/Human.java index c0cc9264ea..f5c86aa89d 100644 --- a/src/Human.java +++ b/src/family_tree/human/Human.java @@ -1,9 +1,12 @@ +package family_tree.human; + +import java.io.Serializable; import java.time.LocalDate; import java.time.Period; import java.util.ArrayList; import java.util.List; -public class Human { +public class Human implements Serializable { private long id; private String name; private Gender gender; diff --git a/src/family_tree/writer/FileHandler.java b/src/family_tree/writer/FileHandler.java new file mode 100644 index 0000000000..fb750e5570 --- /dev/null +++ b/src/family_tree/writer/FileHandler.java @@ -0,0 +1,30 @@ +package family_tree.writer; + +import java.io.*; + +public class FileHandler implements Writer { + private String file; + + public FileHandler(String file) { + this.file = file; + } + + public boolean save(Serializable serializable) { + try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file))) { + objectOutputStream.writeObject(serializable); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public Object read() { + try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file))) { + return objectInputStream.readObject(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/src/family_tree/writer/Writer.java b/src/family_tree/writer/Writer.java new file mode 100644 index 0000000000..54b7c60f5d --- /dev/null +++ b/src/family_tree/writer/Writer.java @@ -0,0 +1,8 @@ +package family_tree.writer; + +import java.io.Serializable; + +public interface Writer { + boolean save(Serializable serializable); + Object read(); +} diff --git a/src/family_tree/writer/tree.txt b/src/family_tree/writer/tree.txt new file mode 100644 index 0000000000000000000000000000000000000000..6d77ab40014388a9136921f6c326f13a7ef8ff11 GIT binary patch literal 833 zcmZvaJ#W)M7{{MDPMov^LJ%(k0a8DJJ%Gf}2~kR0nW>B*bTmhDmF=4Ig}Mw?L3{xQ z1|%X;CI%#;BBZvcGgGB2NK7nz0KNmyb7xW`#lzY6y#0UwNB;N+YMF$Y$1E1n#zQ4J z_sie&CVmgYKc=p&zWTlW(*b7*y#63&$znHzy7|f!w8K^Qlm!DNq97ERn$1(NkBb6l zDCtwuzbPf#po;wY_seg-v0)V|i{NJB88Rb7;{`Gga-aFte zfg_Nj`AA6BpJR$EIBP+ah%G(7gL~v zk`hiD9D?_6Cxf`0Ocm7UdCVd*so(0+(U$&f&fTLIdNgKqjH*LcoBx4Y>;iPJcKR5! zuthDcJf&9${~Nunck~yW{Z)_jK}q4CuN<9Gaa)0V*KoP|lRg-eOxjkpyscqvdLl&A bMhnzm^;3Dl)X+n{JDG(l&e74L<7)mF)#c{< literal 0 HcmV?d00001 From 3eef5add5b169707c53ccee67f88e9a74e331bb3 Mon Sep 17 00:00:00 2001 From: Margo Date: Sun, 18 Aug 2024 21:34:24 +0300 Subject: [PATCH 3/7] FamilyTreeHomeWork3SortBy --- src/Main.java | 8 ++++-- src/family_tree/ComparatorByAge.java | 12 +++++++++ src/family_tree/ComparatorByName.java | 12 +++++++++ src/family_tree/FamilyTreeIterator.java | 27 +++++++++++++++++++++ src/family_tree/family_tree/FamilyTree.java | 19 ++++++++++++++- 5 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 src/family_tree/ComparatorByAge.java create mode 100644 src/family_tree/ComparatorByName.java create mode 100644 src/family_tree/FamilyTreeIterator.java diff --git a/src/Main.java b/src/Main.java index 49b6ce102e..22c1ee9196 100644 --- a/src/Main.java +++ b/src/Main.java @@ -9,11 +9,15 @@ public class Main { final static String file = "src/family_tree/writer/tree.txt"; public static void main(String[] args) { -// FamilyTree tree = testTree(); + FamilyTree tree = testTree(); // save(tree); - FamilyTree tree = load(); +// FamilyTree tree = load(); System.out.println(tree); + tree.sortByAge(); + System.out.println(tree); + tree.sortByName(); + System.out.println(tree); } private static FamilyTree load(){ diff --git a/src/family_tree/ComparatorByAge.java b/src/family_tree/ComparatorByAge.java new file mode 100644 index 0000000000..c84457f7ad --- /dev/null +++ b/src/family_tree/ComparatorByAge.java @@ -0,0 +1,12 @@ +package family_tree; + +import family_tree.human.Human; + +import java.util.Comparator; + +public class ComparatorByAge implements Comparator { + @Override + public int compare(Human o1, Human o2) { + return o1.getAge() - o2.getAge(); + } +} diff --git a/src/family_tree/ComparatorByName.java b/src/family_tree/ComparatorByName.java new file mode 100644 index 0000000000..48c0e39451 --- /dev/null +++ b/src/family_tree/ComparatorByName.java @@ -0,0 +1,12 @@ +package family_tree; + +import family_tree.human.Human; + +import java.util.Comparator; + +public class ComparatorByName implements Comparator { + @Override + public int compare(Human o1, Human o2) { + return o1.getName().compareTo(o2.getName()); + } +} diff --git a/src/family_tree/FamilyTreeIterator.java b/src/family_tree/FamilyTreeIterator.java new file mode 100644 index 0000000000..0a9c6dc521 --- /dev/null +++ b/src/family_tree/FamilyTreeIterator.java @@ -0,0 +1,27 @@ +package family_tree; + +import family_tree.family_tree.FamilyTree; +import family_tree.human.Human; + +import java.util.Iterator; +import java.util.List; + +public class FamilyTreeIterator implements Iterator { + private int index; + private List list; + + public FamilyTreeIterator(List list){ + index = 0; + this.list = list; + } + + @Override + public boolean hasNext() { + return index > list.size(); + } + + @Override + public Human next() { + return list.get(index++); + } +} diff --git a/src/family_tree/family_tree/FamilyTree.java b/src/family_tree/family_tree/FamilyTree.java index 0ddaa0bbae..1bd5e26594 100644 --- a/src/family_tree/family_tree/FamilyTree.java +++ b/src/family_tree/family_tree/FamilyTree.java @@ -1,12 +1,17 @@ package family_tree.family_tree; +import family_tree.ComparatorByAge; +import family_tree.ComparatorByName; +import family_tree.FamilyTreeIterator; import family_tree.human.Human; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; import java.util.List; -public class FamilyTree implements Serializable { +public class FamilyTree implements Serializable, Iterable { private long humanId; private List humans; @@ -65,6 +70,18 @@ public Human getById(long id){ return null; } + public void sortByAge(){ + Collections.sort(humans, new ComparatorByAge()); + } + + public void sortByName(){ + Collections.sort(humans, new ComparatorByName()); + } + + public Iterator iterator(){ + return new FamilyTreeIterator(humans); + } + @Override public String toString(){ return getInfo(); From 6d1c5193ef21798fc6ee375f698788dbc70d6ce5 Mon Sep 17 00:00:00 2001 From: Margo Date: Wed, 21 Aug 2024 21:06:48 +0300 Subject: [PATCH 4/7] FamilyTreeHomeWork4T --- src/Main.java | 10 +++---- src/family_tree/ComparatorByAge.java | 4 +-- src/family_tree/ComparatorByName.java | 4 +-- src/family_tree/FamilyTreeItem.java | 19 +++++++++++++ src/family_tree/FamilyTreeIterator.java | 8 +++--- src/family_tree/family_tree/FamilyTree.java | 31 +++++++++++---------- src/family_tree/human/Human.java | 4 ++- 7 files changed, 51 insertions(+), 29 deletions(-) create mode 100644 src/family_tree/FamilyTreeItem.java diff --git a/src/Main.java b/src/Main.java index 22c1ee9196..e36695f8d8 100644 --- a/src/Main.java +++ b/src/Main.java @@ -13,11 +13,11 @@ public static void main(String[] args) { // save(tree); // FamilyTree tree = load(); - System.out.println(tree); - tree.sortByAge(); - System.out.println(tree); - tree.sortByName(); - System.out.println(tree); + System.out.println(tree); +// tree.sortByAge(); +// System.out.println(tree); +// tree.sortByName(); +// System.out.println(tree); } private static FamilyTree load(){ diff --git a/src/family_tree/ComparatorByAge.java b/src/family_tree/ComparatorByAge.java index c84457f7ad..269caea620 100644 --- a/src/family_tree/ComparatorByAge.java +++ b/src/family_tree/ComparatorByAge.java @@ -4,9 +4,9 @@ import java.util.Comparator; -public class ComparatorByAge implements Comparator { +public class ComparatorByAge> implements Comparator { @Override - public int compare(Human o1, Human o2) { + public int compare(T o1, T o2) { return o1.getAge() - o2.getAge(); } } diff --git a/src/family_tree/ComparatorByName.java b/src/family_tree/ComparatorByName.java index 48c0e39451..145f2f3658 100644 --- a/src/family_tree/ComparatorByName.java +++ b/src/family_tree/ComparatorByName.java @@ -4,9 +4,9 @@ import java.util.Comparator; -public class ComparatorByName implements Comparator { +public class ComparatorByName> implements Comparator { @Override - public int compare(Human o1, Human o2) { + public int compare(T o1, T o2) { return o1.getName().compareTo(o2.getName()); } } diff --git a/src/family_tree/FamilyTreeItem.java b/src/family_tree/FamilyTreeItem.java new file mode 100644 index 0000000000..13989538fd --- /dev/null +++ b/src/family_tree/FamilyTreeItem.java @@ -0,0 +1,19 @@ +package family_tree; + +import java.io.Serializable; +import java.time.LocalDate; +import java.util.List; + +public interface FamilyTreeItem extends Serializable { + String getName(); + void setId(long id); + long getId(); + LocalDate getBirthDate(); + LocalDate getDeathDate(); + boolean addParent(T human); + boolean addChild(T human); + List getParents(); + List getChildren(); + int getAge(); + +} diff --git a/src/family_tree/FamilyTreeIterator.java b/src/family_tree/FamilyTreeIterator.java index 0a9c6dc521..d698663038 100644 --- a/src/family_tree/FamilyTreeIterator.java +++ b/src/family_tree/FamilyTreeIterator.java @@ -6,11 +6,11 @@ import java.util.Iterator; import java.util.List; -public class FamilyTreeIterator implements Iterator { +public class FamilyTreeIterator> implements Iterator { private int index; - private List list; + private List list; - public FamilyTreeIterator(List list){ + public FamilyTreeIterator(List list){ index = 0; this.list = list; } @@ -21,7 +21,7 @@ public boolean hasNext() { } @Override - public Human next() { + public T next() { return list.get(index++); } } diff --git a/src/family_tree/family_tree/FamilyTree.java b/src/family_tree/family_tree/FamilyTree.java index 1bd5e26594..e11609e36e 100644 --- a/src/family_tree/family_tree/FamilyTree.java +++ b/src/family_tree/family_tree/FamilyTree.java @@ -2,6 +2,7 @@ import family_tree.ComparatorByAge; import family_tree.ComparatorByName; +import family_tree.FamilyTreeItem; import family_tree.FamilyTreeIterator; import family_tree.human.Human; @@ -11,19 +12,19 @@ import java.util.Iterator; import java.util.List; -public class FamilyTree implements Serializable, Iterable { +public class FamilyTree> implements Serializable, Iterable { private long humanId; - private List humans; + private List humans; public FamilyTree(){ this(new ArrayList<>()); } - public FamilyTree(List humans){ + public FamilyTree(List humans){ this.humans = humans; } - public boolean add(Human human){ + public boolean add(E human){ if (human == null){ return false; } @@ -39,21 +40,21 @@ public boolean add(Human human){ return false; } - private void addToParents(Human human){ - for (Human parent: human.getParents()){ + private void addToParents(E human){ + for (E parent: human.getParents()){ parent.addChild(human); } } - private void addToChildren(Human human){ - for (Human child: human.getChildren()){ + private void addToChildren(E human){ + for (E child: human.getChildren()){ child.addParent(human); } } - public List getByName(String name){ - List res = new ArrayList<>(); - for (Human human : humans) { + public List getByName(String name){ + List res = new ArrayList<>(); + for (E human : humans) { if (human.getName().equals(name)){ res.add(human); } @@ -61,8 +62,8 @@ public List getByName(String name){ return res; } - public Human getById(long id){ - for (Human human: humans){ + public E getById(long id){ + for (E human: humans){ if (human.getId() == id){ return human; } @@ -78,7 +79,7 @@ public void sortByName(){ Collections.sort(humans, new ComparatorByName()); } - public Iterator iterator(){ + public Iterator iterator(){ return new FamilyTreeIterator(humans); } @@ -91,7 +92,7 @@ public String getInfo() { stringBuilder.append("В семье "); stringBuilder.append(humans.size()); stringBuilder.append(" человек(а) \n"); - for (Human human : humans){ + for (E human : humans){ stringBuilder.append(human); stringBuilder.append("\n"); } diff --git a/src/family_tree/human/Human.java b/src/family_tree/human/Human.java index f5c86aa89d..294d752711 100644 --- a/src/family_tree/human/Human.java +++ b/src/family_tree/human/Human.java @@ -1,12 +1,14 @@ package family_tree.human; +import family_tree.FamilyTreeItem; + import java.io.Serializable; import java.time.LocalDate; import java.time.Period; import java.util.ArrayList; import java.util.List; -public class Human implements Serializable { +public class Human implements Serializable, FamilyTreeItem { private long id; private String name; private Gender gender; From 5dcca74d2296b13435171bfdce12f972004ff888 Mon Sep 17 00:00:00 2001 From: Margo Date: Sun, 25 Aug 2024 17:02:16 +0300 Subject: [PATCH 5/7] FamilyTreeHomeWork5 --- src/Main.java | 51 ++------ .../{ => model}/FamilyTreeIterator.java | 5 +- .../{ => model}/family_tree/FamilyTree.java | 44 ++----- .../family_tree}/FamilyTreeItem.java | 5 +- src/family_tree/{ => model}/human/Gender.java | 2 +- src/family_tree/{ => model}/human/Human.java | 74 +++++++----- src/family_tree/model/human/HumanBuilder.java | 67 +++++++++++ .../human/comparators}/ComparatorByAge.java | 4 +- .../human/comparators}/ComparatorByName.java | 4 +- src/family_tree/model/service/Service.java | 46 ++++++++ .../{ => model}/writer/FileHandler.java | 2 +- .../{ => model}/writer/Writer.java | 2 +- src/family_tree/{ => model}/writer/tree.txt | Bin src/family_tree/presenter/Presenter.java | 45 +++++++ src/family_tree/view/ConsoleUI.java | 110 ++++++++++++++++++ src/family_tree/view/MainMenu.java | 42 +++++++ src/family_tree/view/View.java | 6 + src/family_tree/view/commands/AddChild.java | 13 +++ src/family_tree/view/commands/AddHuman.java | 13 +++ src/family_tree/view/commands/AddParent.java | 13 +++ src/family_tree/view/commands/Command.java | 23 ++++ src/family_tree/view/commands/Finish.java | 15 +++ .../view/commands/GetFamilyTreeInfo.java | 13 +++ src/family_tree/view/commands/SortByAge.java | 13 +++ src/family_tree/view/commands/SortByName.java | 13 +++ 25 files changed, 506 insertions(+), 119 deletions(-) rename src/family_tree/{ => model}/FamilyTreeIterator.java (82%) rename src/family_tree/{ => model}/family_tree/FamilyTree.java (60%) rename src/family_tree/{ => model/family_tree}/FamilyTreeItem.java (81%) rename src/family_tree/{ => model}/human/Gender.java (56%) rename src/family_tree/{ => model}/human/Human.java (71%) create mode 100644 src/family_tree/model/human/HumanBuilder.java rename src/family_tree/{ => model/human/comparators}/ComparatorByAge.java (69%) rename src/family_tree/{ => model/human/comparators}/ComparatorByName.java (70%) create mode 100644 src/family_tree/model/service/Service.java rename src/family_tree/{ => model}/writer/FileHandler.java (95%) rename src/family_tree/{ => model}/writer/Writer.java (78%) rename src/family_tree/{ => model}/writer/tree.txt (100%) create mode 100644 src/family_tree/presenter/Presenter.java create mode 100644 src/family_tree/view/ConsoleUI.java create mode 100644 src/family_tree/view/MainMenu.java create mode 100644 src/family_tree/view/View.java create mode 100644 src/family_tree/view/commands/AddChild.java create mode 100644 src/family_tree/view/commands/AddHuman.java create mode 100644 src/family_tree/view/commands/AddParent.java create mode 100644 src/family_tree/view/commands/Command.java create mode 100644 src/family_tree/view/commands/Finish.java create mode 100644 src/family_tree/view/commands/GetFamilyTreeInfo.java create mode 100644 src/family_tree/view/commands/SortByAge.java create mode 100644 src/family_tree/view/commands/SortByName.java diff --git a/src/Main.java b/src/Main.java index e36695f8d8..834dc9ce36 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,51 +1,14 @@ -import family_tree.family_tree.FamilyTree; -import family_tree.human.Gender; -import family_tree.human.Human; -import family_tree.writer.FileHandler; +import family_tree.model.family_tree.FamilyTree; +import family_tree.model.human.Gender; +import family_tree.model.human.Human; +import family_tree.model.writer.FileHandler; +import family_tree.view.ConsoleUI; import java.time.LocalDate; public class Main { - final static String file = "src/family_tree/writer/tree.txt"; - public static void main(String[] args) { - FamilyTree tree = testTree(); -// save(tree); -// FamilyTree tree = load(); - - System.out.println(tree); -// tree.sortByAge(); -// System.out.println(tree); -// tree.sortByName(); -// System.out.println(tree); - } - - private static FamilyTree load(){ - FileHandler fileHandler = new FileHandler(file); - return (FamilyTree) fileHandler.read(); - } - - private static void save(FamilyTree familyTree){ - FileHandler fileHandler = new FileHandler(file); - fileHandler.save(familyTree); - } - - private static FamilyTree testTree(){ - FamilyTree tree = new FamilyTree(); - - Human human1 = new Human("Ян", LocalDate.of(1977, 8, 30), Gender.Male); - Human human2 = new Human("Светлана", LocalDate.of(1977, 5, 17), Gender.Female); - Human human3 = new Human("Маргарита", LocalDate.of(1997, 2, 16), Gender.Female); - Human human4 = new Human("Нина", LocalDate.of(1949, 5, 11), LocalDate.of(2012, 6, 15), Gender.Female); - human3.addParent(human1); - human3.addParent(human2); - human2.addChild(human3); - human4.addChild(human1); - - tree.add(human1); - tree.add(human2); - tree.add(human3); - tree.add(human4); - return tree; + ConsoleUI consoleUI = new ConsoleUI(); + consoleUI.start(); } } diff --git a/src/family_tree/FamilyTreeIterator.java b/src/family_tree/model/FamilyTreeIterator.java similarity index 82% rename from src/family_tree/FamilyTreeIterator.java rename to src/family_tree/model/FamilyTreeIterator.java index d698663038..f56dbba3f1 100644 --- a/src/family_tree/FamilyTreeIterator.java +++ b/src/family_tree/model/FamilyTreeIterator.java @@ -1,7 +1,6 @@ -package family_tree; +package family_tree.model; -import family_tree.family_tree.FamilyTree; -import family_tree.human.Human; +import family_tree.model.family_tree.FamilyTreeItem; import java.util.Iterator; import java.util.List; diff --git a/src/family_tree/family_tree/FamilyTree.java b/src/family_tree/model/family_tree/FamilyTree.java similarity index 60% rename from src/family_tree/family_tree/FamilyTree.java rename to src/family_tree/model/family_tree/FamilyTree.java index e11609e36e..8f18545c58 100644 --- a/src/family_tree/family_tree/FamilyTree.java +++ b/src/family_tree/model/family_tree/FamilyTree.java @@ -1,10 +1,8 @@ -package family_tree.family_tree; +package family_tree.model.family_tree; -import family_tree.ComparatorByAge; -import family_tree.ComparatorByName; -import family_tree.FamilyTreeItem; -import family_tree.FamilyTreeIterator; -import family_tree.human.Human; +import family_tree.model.human.comparators.ComparatorByAge; +import family_tree.model.human.comparators.ComparatorByName; +import family_tree.model.FamilyTreeIterator; import java.io.Serializable; import java.util.ArrayList; @@ -24,32 +22,8 @@ public FamilyTree(List humans){ this.humans = humans; } - public boolean add(E human){ - if (human == null){ - return false; - } - if (!humans.contains(human)){ - humans.add(human); - human.setId(humanId++); - - addToParents(human); - addToChildren(human); - - return true; - } - return false; - } - - private void addToParents(E human){ - for (E parent: human.getParents()){ - parent.addChild(human); - } - } - - private void addToChildren(E human){ - for (E child: human.getChildren()){ - child.addParent(human); - } + public void add(E human){ + this.humans.add(human); } public List getByName(String name){ @@ -72,15 +46,15 @@ public E getById(long id){ } public void sortByAge(){ - Collections.sort(humans, new ComparatorByAge()); + Collections.sort(humans, new ComparatorByAge<>()); } public void sortByName(){ - Collections.sort(humans, new ComparatorByName()); + Collections.sort(humans, new ComparatorByName<>()); } public Iterator iterator(){ - return new FamilyTreeIterator(humans); + return new FamilyTreeIterator<>(humans); } @Override diff --git a/src/family_tree/FamilyTreeItem.java b/src/family_tree/model/family_tree/FamilyTreeItem.java similarity index 81% rename from src/family_tree/FamilyTreeItem.java rename to src/family_tree/model/family_tree/FamilyTreeItem.java index 13989538fd..c2a807779f 100644 --- a/src/family_tree/FamilyTreeItem.java +++ b/src/family_tree/model/family_tree/FamilyTreeItem.java @@ -1,4 +1,4 @@ -package family_tree; +package family_tree.model.family_tree; import java.io.Serializable; import java.time.LocalDate; @@ -10,9 +10,8 @@ public interface FamilyTreeItem extends Serializable { long getId(); LocalDate getBirthDate(); LocalDate getDeathDate(); - boolean addParent(T human); + boolean addParent(T parent); boolean addChild(T human); - List getParents(); List getChildren(); int getAge(); diff --git a/src/family_tree/human/Gender.java b/src/family_tree/model/human/Gender.java similarity index 56% rename from src/family_tree/human/Gender.java rename to src/family_tree/model/human/Gender.java index 7cb9e48e8b..654ec0ed75 100644 --- a/src/family_tree/human/Gender.java +++ b/src/family_tree/model/human/Gender.java @@ -1,4 +1,4 @@ -package family_tree.human; +package family_tree.model.human; public enum Gender { Male, Female; diff --git a/src/family_tree/human/Human.java b/src/family_tree/model/human/Human.java similarity index 71% rename from src/family_tree/human/Human.java rename to src/family_tree/model/human/Human.java index 294d752711..d5325eb16c 100644 --- a/src/family_tree/human/Human.java +++ b/src/family_tree/model/human/Human.java @@ -1,6 +1,6 @@ -package family_tree.human; +package family_tree.model.human; -import family_tree.FamilyTreeItem; +import family_tree.model.family_tree.FamilyTreeItem; import java.io.Serializable; import java.time.LocalDate; @@ -14,21 +14,26 @@ public class Human implements Serializable, FamilyTreeItem { private Gender gender; private LocalDate birthDate; private LocalDate deathDate; - private List parents; + private Human mother; + private Human father; private List children; - public Human(String name, LocalDate birthDate, LocalDate deathDate, Gender gender){ + public Human(String name, LocalDate birthDate, LocalDate deathDate, Gender gender, Human mother, Human father){ id = -1; this.name = name; this.birthDate = birthDate; this.deathDate = deathDate; this.gender = gender; - parents = new ArrayList<>(); + this.mother = mother; + this.father = father; children = new ArrayList<>(); } public Human(String name, LocalDate birthDate, Gender gender){ - this(name, birthDate, null, gender); + this(name, birthDate, null, gender, null, null); + } + + public Human(){ } public long getId() { @@ -67,8 +72,24 @@ public List getChildren() { return children; } - public List getParents() { - return parents; + public void setChildren(List children) { + this.children = children; + } + + public Human getMother(Human mother) { + return mother; + } + + public void setMother(Human mother) { + this.mother = mother; + } + + public Human getFather() { + return father; + } + + public void setFather(Human father) { + this.father = father; } public boolean addChild(Human child){ @@ -80,11 +101,12 @@ public boolean addChild(Human child){ } public boolean addParent(Human parent){ - if (!parents.contains(parent)){ - parents.add(parent); - return true; + if (parent.gender.equals(Gender.Female)) { + setMother(parent); + } else if (parent.gender.equals(Gender.Male)) { + setFather(parent); } - return false; + return true; } public void setGender(Gender gender){ @@ -117,27 +139,25 @@ public String getInfo(){ stringBuilder.append(getAge()); stringBuilder.append(", пол: "); stringBuilder.append(gender); - stringBuilder.append(", "); - stringBuilder.append(getParentsInfo()); + stringBuilder.append(", мать: "); + stringBuilder.append(getMotherInfo()); + stringBuilder.append(", отец: "); + stringBuilder.append(getFatherInfo()); stringBuilder.append(", "); stringBuilder.append(getChildrenInfo()); return stringBuilder.toString(); } - public String getParentsInfo(){ - StringBuilder par = new StringBuilder(); - par.append("Родители: "); - if (parents.size() != 0){ - par.append(parents.get(0).getName()); - for (int i = 1; i < parents.size(); i++) { - par.append(", "); - par.append(parents.get(i).getName()); - } - }else { - par.append("не известны"); - } - return par.toString(); + public String getMotherInfo(){ + if (this.mother == null) + return "Неизвестно"; + return this.mother.name; } + private String getFatherInfo() { + if (this.father == null) + return "Неизвестно"; + return this.father.name; + } public String getChildrenInfo(){ StringBuilder chil = new StringBuilder(); diff --git a/src/family_tree/model/human/HumanBuilder.java b/src/family_tree/model/human/HumanBuilder.java new file mode 100644 index 0000000000..c9d16557b2 --- /dev/null +++ b/src/family_tree/model/human/HumanBuilder.java @@ -0,0 +1,67 @@ +package family_tree.model.human; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +public class HumanBuilder { + private int humanId; + private Human human; + private String name; + private Gender gender; + private LocalDate birthDate; + private List children; + + public HumanBuilder(){ + createHuman(); + } + + public HumanBuilder setName(String name){ + this.name = name; + return this; + } + + public HumanBuilder setGender(Gender gender) { + this.gender = gender; + return this; + } + + public HumanBuilder setBirthDate(LocalDate birthDate) { + this.birthDate = birthDate; + return this; + } + + public void setChildren() { + human.setChildren(new ArrayList<>()); + } + + public void createHuman(){ + human = new Human(); + } + + private void nextId(){ + human.setId(humanId++); + } + + private void createName(){ + human.setName(name); + } + + private void createGender(){ + human.setGender(gender); + } + + private void createBirthDate(){ + human.setBirthDate(birthDate); + } + + public Human build(){ + createHuman(); + createName(); + createGender(); + createBirthDate(); + nextId(); + setChildren(); + return human; + } +} diff --git a/src/family_tree/ComparatorByAge.java b/src/family_tree/model/human/comparators/ComparatorByAge.java similarity index 69% rename from src/family_tree/ComparatorByAge.java rename to src/family_tree/model/human/comparators/ComparatorByAge.java index 269caea620..94a9014152 100644 --- a/src/family_tree/ComparatorByAge.java +++ b/src/family_tree/model/human/comparators/ComparatorByAge.java @@ -1,6 +1,6 @@ -package family_tree; +package family_tree.model.human.comparators; -import family_tree.human.Human; +import family_tree.model.family_tree.FamilyTreeItem; import java.util.Comparator; diff --git a/src/family_tree/ComparatorByName.java b/src/family_tree/model/human/comparators/ComparatorByName.java similarity index 70% rename from src/family_tree/ComparatorByName.java rename to src/family_tree/model/human/comparators/ComparatorByName.java index 145f2f3658..9f275df1fc 100644 --- a/src/family_tree/ComparatorByName.java +++ b/src/family_tree/model/human/comparators/ComparatorByName.java @@ -1,6 +1,6 @@ -package family_tree; +package family_tree.model.human.comparators; -import family_tree.human.Human; +import family_tree.model.family_tree.FamilyTreeItem; import java.util.Comparator; diff --git a/src/family_tree/model/service/Service.java b/src/family_tree/model/service/Service.java new file mode 100644 index 0000000000..83d4f35e23 --- /dev/null +++ b/src/family_tree/model/service/Service.java @@ -0,0 +1,46 @@ +package family_tree.model.service; + +import family_tree.model.family_tree.FamilyTree; +import family_tree.model.human.Gender; +import family_tree.model.human.Human; +import family_tree.model.human.HumanBuilder; + +import java.time.LocalDate; + +public class Service { + private int idHuman; + private FamilyTree tree; + private HumanBuilder humanBuilder; + + public Service(){ + tree = new FamilyTree<>(); + humanBuilder = new HumanBuilder(); + } + + public void addHuman(String name, Gender gender, LocalDate birthDate){ + Human human = humanBuilder.setName(name).setGender(gender).setBirthDate(birthDate).build(); + tree.add(human); + } + + public boolean addChild(int idHuman, int idChild){ + tree.getById(idChild).addParent(tree.getById(idHuman)); + return tree.getById(idHuman).addChild(tree.getById(idChild)); + } + + public boolean addParent(int child, int parent){ + tree.getById(parent).addChild(tree.getById(child)); + return tree.getById(child).addParent(tree.getById(parent)); + } + + public FamilyTree getFamilyTree(){ + return tree; + } + + public void sortByName(){ + tree.sortByName(); + } + + public void sortByAge(){ + tree.sortByAge(); + } +} diff --git a/src/family_tree/writer/FileHandler.java b/src/family_tree/model/writer/FileHandler.java similarity index 95% rename from src/family_tree/writer/FileHandler.java rename to src/family_tree/model/writer/FileHandler.java index fb750e5570..5a1378582c 100644 --- a/src/family_tree/writer/FileHandler.java +++ b/src/family_tree/model/writer/FileHandler.java @@ -1,4 +1,4 @@ -package family_tree.writer; +package family_tree.model.writer; import java.io.*; diff --git a/src/family_tree/writer/Writer.java b/src/family_tree/model/writer/Writer.java similarity index 78% rename from src/family_tree/writer/Writer.java rename to src/family_tree/model/writer/Writer.java index 54b7c60f5d..3734b355da 100644 --- a/src/family_tree/writer/Writer.java +++ b/src/family_tree/model/writer/Writer.java @@ -1,4 +1,4 @@ -package family_tree.writer; +package family_tree.model.writer; import java.io.Serializable; diff --git a/src/family_tree/writer/tree.txt b/src/family_tree/model/writer/tree.txt similarity index 100% rename from src/family_tree/writer/tree.txt rename to src/family_tree/model/writer/tree.txt diff --git a/src/family_tree/presenter/Presenter.java b/src/family_tree/presenter/Presenter.java new file mode 100644 index 0000000000..3a684f1c3a --- /dev/null +++ b/src/family_tree/presenter/Presenter.java @@ -0,0 +1,45 @@ +package family_tree.presenter; + +import family_tree.model.human.Gender; +import family_tree.model.service.Service; +import family_tree.view.View; + +import java.time.LocalDate; + +public class Presenter { + private View view; + private Service service; + + public Presenter(View view){ + this.view = view; + service = new Service(); + } + + public void addHuman(String name, Gender gender, LocalDate birthDate){ + service.addHuman(name, gender, birthDate); + getFamilyTreeInfo(); + } + + public boolean addParent(int childId, int parentId){ + return service.addParent(childId, parentId); + } + + public boolean addChild(int parentId, int childId){ + return service.addChild(parentId, childId); + } + + public void sortByAge(){ + service.sortByAge(); + getFamilyTreeInfo(); + } + + public void sortByName(){ + service.sortByName(); + getFamilyTreeInfo(); + } + + public void getFamilyTreeInfo(){ + String info = service.getFamilyTree().toString(); + view.printAnswer(info); + } +} diff --git a/src/family_tree/view/ConsoleUI.java b/src/family_tree/view/ConsoleUI.java new file mode 100644 index 0000000000..952a361dbc --- /dev/null +++ b/src/family_tree/view/ConsoleUI.java @@ -0,0 +1,110 @@ +package family_tree.view; + +import family_tree.model.human.Gender; +import family_tree.presenter.Presenter; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Scanner; + +public class ConsoleUI implements View{ + private static final String INPUT_ERROR = "Введено неверное значение"; + private Scanner scanner; + private Presenter presenter; + private boolean work; + private MainMenu menu; + + public ConsoleUI(){ + scanner = new Scanner(System.in); + presenter = new Presenter(this); + work = true; + menu = new MainMenu(this); + } + + public void start() { + System.out.println("Приветствие!"); + while (work){ + System.out.println(menu.menu()); + String strChoice = scanner.nextLine(); + int choice = Integer.parseInt(strChoice); + menu.execute(choice); + } + } + + public void finish() { + System.out.println("До новых встреч!"); + work = false; + } + + public void getFamilyTreeInfo(){ + presenter.getFamilyTreeInfo(); + } + + public void sortByAge(){ + presenter.sortByAge(); + } + + public void sortByName(){ + presenter.sortByName(); + } + + public void addParent(){ + presenter.getFamilyTreeInfo(); + int childId, parentId; + printAnswer("Введите id ребёнка"); + childId = Integer.parseInt(scanner.nextLine()); + printAnswer("Введите id родителя"); + parentId = Integer.parseInt(scanner.nextLine()); + + presenter.addParent(childId, parentId); + } + + public void addChild(){ + presenter.getFamilyTreeInfo(); + int childId, parentId; + printAnswer("Введите id родителя"); + parentId = Integer.parseInt(scanner.nextLine()); + printAnswer("Введите id ребёнка"); + childId = Integer.parseInt(scanner.nextLine()); + presenter.addChild(parentId, childId); + } + public void inputError(){ + printAnswer(INPUT_ERROR); + } + + public void addHuman(){ + String name; + Gender gender; + LocalDate birthDate; + String strFormatter = "dd.MM.yyyy"; + printAnswer("Введите имя:"); + name = scanner.nextLine(); + printAnswer("Укажите пол\n1 - мужской, 2 - женский"); + String sex = scanner.nextLine(); + while (!(sex.charAt(0) == '1' || sex.charAt(0) == '2')) { + inputError(); + printAnswer("Укажите пол\n1 - мужской, 2 - женский"); + sex = scanner.nextLine(); + } + if (sex.equals("1")) + gender = Gender.Male; + else + gender = Gender.Female; + + printAnswer("Введите дату рождения в формате " + strFormatter); + String strDate = scanner.nextLine(); + while (strDate.length() != 10 && strDate.split(".").length != 3) { + inputError(); + printAnswer("Введите дату рождения в формате " + strFormatter); + strDate = scanner.nextLine(); + } + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(strFormatter); + birthDate = LocalDate.parse(strDate, dateTimeFormatter); + presenter.addHuman(name, gender, birthDate); + } + + @Override + public void printAnswer(String answer) { + System.out.println(answer); + } +} diff --git a/src/family_tree/view/MainMenu.java b/src/family_tree/view/MainMenu.java new file mode 100644 index 0000000000..2fc949c3b2 --- /dev/null +++ b/src/family_tree/view/MainMenu.java @@ -0,0 +1,42 @@ +package family_tree.view; + +import family_tree.view.commands.*; + +import java.util.ArrayList; +import java.util.List; + +public class MainMenu { + private List commands; + + public MainMenu(ConsoleUI consoleUI){ + commands = new ArrayList<>(); + commands.add(new AddHuman(consoleUI)); + commands.add(new AddChild(consoleUI)); + commands.add(new AddParent(consoleUI)); + commands.add(new SortByAge(consoleUI)); + commands.add(new SortByName(consoleUI)); + commands.add(new GetFamilyTreeInfo(consoleUI)); + commands.add(new Finish(consoleUI)); + } + + public String menu(){ + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("Список команд:\n"); + for (int i = 0; i < commands.size(); i++) { + stringBuilder.append(i+1); + stringBuilder.append(". "); + stringBuilder.append(commands.get(i).getDescription()); + stringBuilder.append("\n"); + } + return stringBuilder.toString(); + } + + public void execute(int choice){ + Command command = commands.get(choice - 1); + command.execute(); + } + + public int getSize(){ + return commands.size(); + } +} diff --git a/src/family_tree/view/View.java b/src/family_tree/view/View.java new file mode 100644 index 0000000000..bd8de3da8d --- /dev/null +++ b/src/family_tree/view/View.java @@ -0,0 +1,6 @@ +package family_tree.view; + +public interface View { + void start(); + void printAnswer(String answer); +} diff --git a/src/family_tree/view/commands/AddChild.java b/src/family_tree/view/commands/AddChild.java new file mode 100644 index 0000000000..e8a045fe70 --- /dev/null +++ b/src/family_tree/view/commands/AddChild.java @@ -0,0 +1,13 @@ +package family_tree.view.commands; + +import family_tree.view.ConsoleUI; + +public class AddChild extends Command{ + public AddChild(ConsoleUI consoleUI){ + super("Добавить ребенка", consoleUI); + } + @Override + public void execute(){ + getConsoleUI().addChild(); + } +} diff --git a/src/family_tree/view/commands/AddHuman.java b/src/family_tree/view/commands/AddHuman.java new file mode 100644 index 0000000000..2f949afe99 --- /dev/null +++ b/src/family_tree/view/commands/AddHuman.java @@ -0,0 +1,13 @@ +package family_tree.view.commands; + +import family_tree.view.ConsoleUI; + +public class AddHuman extends Command{ + public AddHuman(ConsoleUI consoleUI){ + super("Добавить человека", consoleUI); + } + @Override + public void execute(){ + getConsoleUI().addHuman(); + } +} diff --git a/src/family_tree/view/commands/AddParent.java b/src/family_tree/view/commands/AddParent.java new file mode 100644 index 0000000000..7c660b80ac --- /dev/null +++ b/src/family_tree/view/commands/AddParent.java @@ -0,0 +1,13 @@ +package family_tree.view.commands; + +import family_tree.view.ConsoleUI; + +public class AddParent extends Command{ + public AddParent(ConsoleUI consoleUI){ + super("Добавить родителя", consoleUI); + } + @Override + public void execute(){ + getConsoleUI().addParent(); + } +} diff --git a/src/family_tree/view/commands/Command.java b/src/family_tree/view/commands/Command.java new file mode 100644 index 0000000000..eb1db75994 --- /dev/null +++ b/src/family_tree/view/commands/Command.java @@ -0,0 +1,23 @@ +package family_tree.view.commands; + +import family_tree.view.ConsoleUI; + +public abstract class Command { + private String description; + private ConsoleUI consoleUI; + + public Command(String description, ConsoleUI consoleUI) { + this.consoleUI = consoleUI; + this.description = description; + } + + public String getDescription() { + return description; + } + + ConsoleUI getConsoleUI(){ + return consoleUI; + } + + public abstract void execute(); +} diff --git a/src/family_tree/view/commands/Finish.java b/src/family_tree/view/commands/Finish.java new file mode 100644 index 0000000000..7419c25e05 --- /dev/null +++ b/src/family_tree/view/commands/Finish.java @@ -0,0 +1,15 @@ +package family_tree.view.commands; + +import family_tree.view.ConsoleUI; + +public class Finish extends Command{ + + public Finish(ConsoleUI consoleUI) { + super("Закончить работу", consoleUI); + } + + @Override + public void execute(){ + getConsoleUI().finish(); + } +} diff --git a/src/family_tree/view/commands/GetFamilyTreeInfo.java b/src/family_tree/view/commands/GetFamilyTreeInfo.java new file mode 100644 index 0000000000..0934122d8a --- /dev/null +++ b/src/family_tree/view/commands/GetFamilyTreeInfo.java @@ -0,0 +1,13 @@ +package family_tree.view.commands; + +import family_tree.view.ConsoleUI; + +public class GetFamilyTreeInfo extends Command{ + public GetFamilyTreeInfo(ConsoleUI consoleUI){ + super("Получить семейное древо", consoleUI); + } + @Override + public void execute(){ + getConsoleUI().getFamilyTreeInfo(); + } +} diff --git a/src/family_tree/view/commands/SortByAge.java b/src/family_tree/view/commands/SortByAge.java new file mode 100644 index 0000000000..7b17126e2b --- /dev/null +++ b/src/family_tree/view/commands/SortByAge.java @@ -0,0 +1,13 @@ +package family_tree.view.commands; + +import family_tree.view.ConsoleUI; + +public class SortByAge extends Command{ + public SortByAge(ConsoleUI consoleUI){ + super("Отсортировать по возрасту", consoleUI); + } + @Override + public void execute(){ + getConsoleUI().sortByAge(); + } +} diff --git a/src/family_tree/view/commands/SortByName.java b/src/family_tree/view/commands/SortByName.java new file mode 100644 index 0000000000..7b60724495 --- /dev/null +++ b/src/family_tree/view/commands/SortByName.java @@ -0,0 +1,13 @@ +package family_tree.view.commands; + +import family_tree.view.ConsoleUI; + +public class SortByName extends Command{ + public SortByName(ConsoleUI consoleUI){ + super("Отсортировать по имени", consoleUI); + } + @Override + public void execute(){ + getConsoleUI().sortByName(); + } +} From 668d65dab7d0a48acc526a4a2d4921e6e72a3ad1 Mon Sep 17 00:00:00 2001 From: Margo Date: Wed, 28 Aug 2024 22:41:37 +0300 Subject: [PATCH 6/7] FamilyTreeHomeWork6 --- src/family_tree/model/human/Human.java | 3 +-- src/family_tree/model/service/Service.java | 17 +++++++++++++ src/family_tree/model/writer/FileHandler.java | 6 ++++- src/family_tree/model/writer/Writer.java | 1 + src/family_tree/model/writer/tree.txt | Bin 833 -> 161 bytes src/family_tree/presenter/Presenter.java | 9 +++++++ src/family_tree/view/ConsoleUI.java | 24 ++++++++++++++++++ src/family_tree/view/MainMenu.java | 2 ++ .../view/commands/LoadFromFile.java | 13 ++++++++++ src/family_tree/view/commands/SaveToFile.java | 13 ++++++++++ 10 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 src/family_tree/view/commands/LoadFromFile.java create mode 100644 src/family_tree/view/commands/SaveToFile.java diff --git a/src/family_tree/model/human/Human.java b/src/family_tree/model/human/Human.java index d5325eb16c..5ea16ebaa9 100644 --- a/src/family_tree/model/human/Human.java +++ b/src/family_tree/model/human/Human.java @@ -2,13 +2,12 @@ import family_tree.model.family_tree.FamilyTreeItem; -import java.io.Serializable; import java.time.LocalDate; import java.time.Period; import java.util.ArrayList; import java.util.List; -public class Human implements Serializable, FamilyTreeItem { +public class Human implements FamilyTreeItem { private long id; private String name; private Gender gender; diff --git a/src/family_tree/model/service/Service.java b/src/family_tree/model/service/Service.java index 83d4f35e23..4be1ead594 100644 --- a/src/family_tree/model/service/Service.java +++ b/src/family_tree/model/service/Service.java @@ -4,6 +4,7 @@ import family_tree.model.human.Gender; import family_tree.model.human.Human; import family_tree.model.human.HumanBuilder; +import family_tree.model.writer.FileHandler; import java.time.LocalDate; @@ -11,10 +12,12 @@ public class Service { private int idHuman; private FamilyTree tree; private HumanBuilder humanBuilder; + FileHandler fileHandler; public Service(){ tree = new FamilyTree<>(); humanBuilder = new HumanBuilder(); + fileHandler = new FileHandler(); } public void addHuman(String name, Gender gender, LocalDate birthDate){ @@ -43,4 +46,18 @@ public void sortByName(){ public void sortByAge(){ tree.sortByAge(); } + + public boolean saveToFile(String filename){ + fileHandler.setFile(filename); + return fileHandler.save(tree); + } + + public boolean loadFromFile(String filePath){ + fileHandler.setFile(filePath); + tree = (FamilyTree) fileHandler.read(); + if (tree.equals(null)) + return false; + else + return true; + } } diff --git a/src/family_tree/model/writer/FileHandler.java b/src/family_tree/model/writer/FileHandler.java index 5a1378582c..2e963bfc2b 100644 --- a/src/family_tree/model/writer/FileHandler.java +++ b/src/family_tree/model/writer/FileHandler.java @@ -5,7 +5,7 @@ public class FileHandler implements Writer { private String file; - public FileHandler(String file) { + public FileHandler() { this.file = file; } @@ -27,4 +27,8 @@ public Object read() { return null; } } + + public void setFile(String file) { + this.file = file; + } } diff --git a/src/family_tree/model/writer/Writer.java b/src/family_tree/model/writer/Writer.java index 3734b355da..743302f2b0 100644 --- a/src/family_tree/model/writer/Writer.java +++ b/src/family_tree/model/writer/Writer.java @@ -5,4 +5,5 @@ public interface Writer { boolean save(Serializable serializable); Object read(); + void setFile(String file); } diff --git a/src/family_tree/model/writer/tree.txt b/src/family_tree/model/writer/tree.txt index 6d77ab40014388a9136921f6c326f13a7ef8ff11..2d3f22aaed3c70589aa902e261016110542be71d 100644 GIT binary patch delta 78 zcmX@ewvf?c&07Z6;vxo(w8Y%ZoXYr;qSREq-29Z(96e+aH?V97Q1ai=T_t7ummf|v SGGb(yn5xIYP|m^t1Qh_8CmdS< literal 833 zcmZvaJ#W)M7{{MDPMov^LJ%(k0a8DJJ%Gf}2~kR0nW>B*bTmhDmF=4Ig}Mw?L3{xQ z1|%X;CI%#;BBZvcGgGB2NK7nz0KNmyb7xW`#lzY6y#0UwNB;N+YMF$Y$1E1n#zQ4J z_sie&CVmgYKc=p&zWTlW(*b7*y#63&$znHzy7|f!w8K^Qlm!DNq97ERn$1(NkBb6l zDCtwuzbPf#po;wY_seg-v0)V|i{NJB88Rb7;{`Gga-aFte zfg_Nj`AA6BpJR$EIBP+ah%G(7gL~v zk`hiD9D?_6Cxf`0Ocm7UdCVd*so(0+(U$&f&fTLIdNgKqjH*LcoBx4Y>;iPJcKR5! zuthDcJf&9${~Nunck~yW{Z)_jK}q4CuN<9Gaa)0V*KoP|lRg-eOxjkpyscqvdLl&A bMhnzm^;3Dl)X+n{JDG(l&e74L<7)mF)#c{< diff --git a/src/family_tree/presenter/Presenter.java b/src/family_tree/presenter/Presenter.java index 3a684f1c3a..6a1efd9f0b 100644 --- a/src/family_tree/presenter/Presenter.java +++ b/src/family_tree/presenter/Presenter.java @@ -42,4 +42,13 @@ public void getFamilyTreeInfo(){ String info = service.getFamilyTree().toString(); view.printAnswer(info); } + + public boolean saveToFile(String filename){ + return service.saveToFile(filename); + } + + public boolean loadFromFile(String filename){ + return service.loadFromFile(filename); + } + } diff --git a/src/family_tree/view/ConsoleUI.java b/src/family_tree/view/ConsoleUI.java index 952a361dbc..3054a038b5 100644 --- a/src/family_tree/view/ConsoleUI.java +++ b/src/family_tree/view/ConsoleUI.java @@ -103,6 +103,30 @@ public void addHuman(){ presenter.addHuman(name, gender, birthDate); } + public void saveToFile(){ + String filename; + String file = "src/family_tree/model/writer/"; + printAnswer("Укажите имя файла"); + filename = scanner.nextLine(); + file += filename + ".txt"; + if (presenter.saveToFile(file)) + printAnswer("Файл " + filename + " успешно сохранен"); + else + printAnswer("Ошибка сохранения"); + } + + public void loadFromFile(){ + String filename; + String file = "src/family_tree/model/writer/"; + printAnswer("Укажите имя файла"); + filename = scanner.nextLine(); + file += filename + ".txt"; + if (presenter.loadFromFile(file)) + printAnswer("Файл " + filename + " успешно загружен"); + else + printAnswer("Ошибка загрузки"); + } + @Override public void printAnswer(String answer) { System.out.println(answer); diff --git a/src/family_tree/view/MainMenu.java b/src/family_tree/view/MainMenu.java index 2fc949c3b2..462b0b11c5 100644 --- a/src/family_tree/view/MainMenu.java +++ b/src/family_tree/view/MainMenu.java @@ -16,6 +16,8 @@ public MainMenu(ConsoleUI consoleUI){ commands.add(new SortByAge(consoleUI)); commands.add(new SortByName(consoleUI)); commands.add(new GetFamilyTreeInfo(consoleUI)); + commands.add(new LoadFromFile(consoleUI)); + commands.add(new SaveToFile(consoleUI)); commands.add(new Finish(consoleUI)); } diff --git a/src/family_tree/view/commands/LoadFromFile.java b/src/family_tree/view/commands/LoadFromFile.java new file mode 100644 index 0000000000..47b302da32 --- /dev/null +++ b/src/family_tree/view/commands/LoadFromFile.java @@ -0,0 +1,13 @@ +package family_tree.view.commands; + +import family_tree.view.ConsoleUI; + +public class LoadFromFile extends Command{ + public LoadFromFile(ConsoleUI consoleUI){ + super("Загрузить древо из файла", consoleUI); + } + @Override + public void execute(){ + getConsoleUI().loadFromFile(); + } +} diff --git a/src/family_tree/view/commands/SaveToFile.java b/src/family_tree/view/commands/SaveToFile.java new file mode 100644 index 0000000000..a0d02311a7 --- /dev/null +++ b/src/family_tree/view/commands/SaveToFile.java @@ -0,0 +1,13 @@ +package family_tree.view.commands; + +import family_tree.view.ConsoleUI; + +public class SaveToFile extends Command{ + public SaveToFile(ConsoleUI consoleUI){ + super("Сохранить древо в файл", consoleUI); + } + @Override + public void execute(){ + getConsoleUI().saveToFile(); + } +} From c156386493df6398d2580ef9e9db0143fa84802a Mon Sep 17 00:00:00 2001 From: Margo Date: Sat, 31 Aug 2024 23:31:53 +0300 Subject: [PATCH 7/7] FamilyTreeHomeWork7 --- src/family_tree/model/service/Service.java | 14 +++++------ src/family_tree/model/writer/FileManager.java | 22 ++++++++++++++++++ src/family_tree/model/writer/tree.txt | Bin 161 -> 571 bytes 3 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 src/family_tree/model/writer/FileManager.java diff --git a/src/family_tree/model/service/Service.java b/src/family_tree/model/service/Service.java index 4be1ead594..02c1952bb5 100644 --- a/src/family_tree/model/service/Service.java +++ b/src/family_tree/model/service/Service.java @@ -5,6 +5,7 @@ import family_tree.model.human.Human; import family_tree.model.human.HumanBuilder; import family_tree.model.writer.FileHandler; +import family_tree.model.writer.FileManager; import java.time.LocalDate; @@ -12,12 +13,13 @@ public class Service { private int idHuman; private FamilyTree tree; private HumanBuilder humanBuilder; - FileHandler fileHandler; + private FileManager fileManager; + public Service(){ tree = new FamilyTree<>(); humanBuilder = new HumanBuilder(); - fileHandler = new FileHandler(); + fileManager = new FileManager(new FileHandler()); } public void addHuman(String name, Gender gender, LocalDate birthDate){ @@ -47,14 +49,12 @@ public void sortByAge(){ tree.sortByAge(); } - public boolean saveToFile(String filename){ - fileHandler.setFile(filename); - return fileHandler.save(tree); + public boolean saveToFile(String file){ + return fileManager.saveToFile(file,getFamilyTree()); } public boolean loadFromFile(String filePath){ - fileHandler.setFile(filePath); - tree = (FamilyTree) fileHandler.read(); + tree = fileManager.loadFromFile(filePath); if (tree.equals(null)) return false; else diff --git a/src/family_tree/model/writer/FileManager.java b/src/family_tree/model/writer/FileManager.java new file mode 100644 index 0000000000..b930ee186c --- /dev/null +++ b/src/family_tree/model/writer/FileManager.java @@ -0,0 +1,22 @@ +package family_tree.model.writer; + +import family_tree.model.family_tree.FamilyTree; +import family_tree.model.human.Human; + +public class FileManager { + private FileHandler fileHandler; + + public FileManager(FileHandler fileHandler) { + this.fileHandler = fileHandler; + } + + public boolean saveToFile(String fileName, FamilyTree familyTree){ + fileHandler.setFile(fileName); + return fileHandler.save(familyTree); + } + + public FamilyTree loadFromFile(String file){ + fileHandler.setFile(file); + return (FamilyTree) fileHandler.read(); + } +} diff --git a/src/family_tree/model/writer/tree.txt b/src/family_tree/model/writer/tree.txt index 2d3f22aaed3c70589aa902e261016110542be71d..4da673b1d393310509bfa7ddbf84da3fbf6ed956 100644 GIT binary patch literal 571 zcmZ`$u};G<6nshBq)33OA|_NoOib|yR6;_6(pF(AD+1HFsZpE+$8A%FN=WfyN(qPU9%eKcp9oHf!y=CaPQKF6=#d0} zo~L4n-abt*+hF$x42Lbx1xw!&0TuTg4>1}D8X%V@qMpVuKhkDJfsO*5UC!}XG19Bo z+T9DjFM!d4VnQ#8mKdX=)EQD#%O}aQX*Z{-+&@mg-*;vYHzt(ZU{aZ7;f!+8-@}3k zSk2-H$_R3!E)G<=?n1fSr-8>wcmWeIq{bsS)2M