Skip to content

Commit c3e9c35

Browse files
authored
Merge pull request mouredev#6432 from martinbohorquez/java#34
mouredev#34 - java
2 parents cbe01f5 + ad2ab2a commit c3e9c35

File tree

1 file changed

+307
-0
lines changed

1 file changed

+307
-0
lines changed
Lines changed: 307 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,307 @@
1+
import java.util.*;
2+
3+
/**
4+
* #34 ÁRBOL GENEALÓGICO DE LA CASA DEL DRAGÓN
5+
*
6+
* @author martinbohorquez
7+
*/
8+
public class martinbohorquez {
9+
public static void main(String[] args) {
10+
FamilyTree tree = new FamilyTree();
11+
12+
tree.addPerson(1, "Jocelyn", Gender.FEMALE);
13+
tree.addPerson(2, "Aemon", Gender.MALE);
14+
15+
tree.setPartner(1, 2);
16+
17+
tree.addPerson(3, "Rhaenys", Gender.FEMALE);
18+
19+
tree.addChild(1, 3);
20+
21+
tree.addPerson(4, "Corlys", Gender.MALE);
22+
23+
tree.setPartner(3, 4);
24+
25+
tree.addPerson(5, "Laena", Gender.FEMALE);
26+
tree.addPerson(6, "Laenor", Gender.MALE);
27+
28+
tree.addChild(3, 5);
29+
tree.addChild(3, 6);
30+
31+
tree.addPerson(7, "Baelon", Gender.MALE);
32+
tree.addPerson(8, "Alyssa", Gender.FEMALE);
33+
34+
tree.setPartner(7, 8);
35+
36+
tree.addPerson(9, "Viserys I", Gender.MALE);
37+
tree.addPerson(10, "Daemon", Gender.MALE);
38+
39+
tree.addChild(7, 9);
40+
tree.addChild(8, 10);
41+
42+
tree.addPerson(11, "Aemma", Gender.FEMALE);
43+
44+
tree.setPartner(9, 11);
45+
46+
tree.addPerson(12, "Rhaenyra", Gender.FEMALE);
47+
48+
tree.addChild(9, 12);
49+
50+
tree.setPartner(10, 12);
51+
52+
tree.addPerson(13, "Aegon", Gender.MALE);
53+
tree.addPerson(14, "Viserys", Gender.MALE);
54+
55+
tree.addChild(12, 13);
56+
tree.addChild(12, 14);
57+
58+
tree.displayTree();
59+
}
60+
61+
static class Person implements Comparable<Person> {
62+
private Integer id;
63+
private String name;
64+
private Integer level;
65+
private Gender gender;
66+
private Person partner;
67+
private Person father;
68+
private Person mother;
69+
private Set<Person> children;
70+
71+
public Person(Integer id, String name, Gender gender) {
72+
this.id = id;
73+
this.name = name;
74+
this.level = 0;
75+
this.gender = gender;
76+
this.partner = null;
77+
this.father = null;
78+
this.mother = null;
79+
children = new TreeSet<>();
80+
}
81+
82+
public Integer getId() {
83+
return id;
84+
}
85+
86+
public void setId(Integer id) {
87+
this.id = id;
88+
}
89+
90+
public String getName() {
91+
return name;
92+
}
93+
94+
public void setName(String name) {
95+
this.name = name;
96+
}
97+
98+
public Integer getLevel() {
99+
return level;
100+
}
101+
102+
public void setLevel(Integer level) {
103+
this.level = level;
104+
}
105+
106+
public Gender getGender() {
107+
return gender;
108+
}
109+
110+
public void setGender(Gender gender) {
111+
this.gender = gender;
112+
}
113+
114+
public Person getPartner() {
115+
return partner;
116+
}
117+
118+
public void setPartner(Person partner) {
119+
this.partner = partner;
120+
}
121+
122+
public Person getFather() {
123+
return father;
124+
}
125+
126+
public void setFather(Person father) {
127+
if (getFather() == null) {
128+
if (father != null) {
129+
father.addChild(this);
130+
this.father = father;
131+
System.out.printf("A %s se le ha asignado un padre: %s.%n", getName(), father.getName());
132+
} else System.out.printf("%s aún no tiene asignado un padre.%n", getName());
133+
} else System.out.printf("%s ya tiene un padre con nombre %s.%n", getName(), getFather().getName());
134+
}
135+
136+
public Person getMother() {
137+
return mother;
138+
}
139+
140+
public void setMother(Person mother) {
141+
if (getMother() == null) {
142+
if (mother != null) {
143+
mother.addChild(this);
144+
this.mother = mother;
145+
System.out.printf("A %s se le ha asignado una madre: %s.%n", getName(), mother.getName());
146+
} else System.out.printf("%s aún no tiene asignado un padre.%n", getName());
147+
} else System.out.printf("%s ya tiene una madre con nombre %s.%n", getName(), getMother().getName());
148+
}
149+
150+
public Set<Person> getChildren() {
151+
return children;
152+
}
153+
154+
public void setChildren(Set<Person> children) {
155+
this.children = children;
156+
}
157+
158+
private void addPartner(Person partner) {
159+
if (getPartner() != null) System.out.printf("%s ya está emparejado con %s.%n", getName(), getPartner());
160+
else if (partner.getPartner() != null) System.out.printf("%s ya está emparejado con %s.%n",
161+
partner.getName(), partner.getPartner());
162+
else {
163+
setPartner(partner);
164+
partner.setPartner(this);
165+
System.out.printf("%s es pareja de %s.%n", getName(), partner.getName());
166+
}
167+
}
168+
169+
private Person addChild(Person child) {
170+
if (getChildren().contains(child)) {
171+
if (child.getGender() == Gender.MALE)
172+
System.out.printf("%s ya es hijo de %s.%n", child.getName(), getName());
173+
if (child.getGender() == Gender.FEMALE)
174+
System.out.printf("%s ya es hija de %s.%n", child.getName(), getName());
175+
} else if (child.getFather() != null && child.getMother() != null)
176+
System.out.printf("%s tiene como padres a: %s y %s.%n",
177+
child.getName(), child.getFather().getName(), child.getMother().getName());
178+
else {
179+
getChildren().add(child);
180+
if (child.getGender() == Gender.MALE)
181+
System.out.printf("A %s se le ha asignado un hijo: %s.%n", getName(), child.getName());
182+
if (child.getGender() == Gender.FEMALE)
183+
System.out.printf("A %s se le ha asignado una hija: %s.%n", getName(), child.getName());
184+
if (getGender() == Gender.MALE) {
185+
child.setFather(this);
186+
if (child.getMother() == null) child.setMother(getPartner());
187+
else System.out.printf("%s tiene como padres a: %s y %s.%n",
188+
child.getName(), child.getFather().getName(), child.getMother().getName());
189+
}
190+
if (getGender() == Gender.FEMALE) {
191+
child.setMother(this);
192+
if (child.getFather() == null) child.setFather(getPartner());
193+
else System.out.printf("%s tiene como padres a: %s y %s.%n",
194+
child.getName(), child.getFather().getName(), child.getMother().getName());
195+
}
196+
}
197+
return this;
198+
}
199+
200+
@Override
201+
public int compareTo(Person other) {
202+
return this.id.compareTo(other.id);
203+
}
204+
}
205+
206+
public enum Gender {
207+
MALE("Hombre"),
208+
FEMALE("Mujer");
209+
210+
private final String displayName;
211+
212+
// Constructor to initialize the display name
213+
Gender(String displayName) {
214+
this.displayName = displayName;
215+
}
216+
217+
@Override
218+
public String toString() {
219+
return displayName;
220+
}
221+
}
222+
223+
static class FamilyTree {
224+
private Map<Integer, Person> people;
225+
private int nivel;
226+
227+
public FamilyTree() {
228+
people = new LinkedHashMap<>();
229+
}
230+
231+
private void addPerson(Integer id, String name, Gender gender) {
232+
if (people.containsKey(id)) System.out.printf("La persona con ID: %d ya existe!%n", id);
233+
else {
234+
Person person = new Person(id, name, gender);
235+
people.put(id, person);
236+
System.out.printf("La persona con nombre %s [ID: %d] ha sido añadida al árbol.%n", name, id);
237+
}
238+
}
239+
240+
private void removePerson(Integer id) {
241+
if (people.containsKey(id)) {
242+
Person person = people.get(id);
243+
people.remove(id);
244+
System.out.printf("La persona con nombre %s [ID: %d] ha sido removida del árbol.%n",
245+
person.getName(), id);
246+
}
247+
}
248+
249+
private void setPartner(Integer id1, Integer id2) {
250+
if (people.containsKey(id1)) {
251+
if (people.containsKey(id2)) people.get(id1).addPartner(people.get(id2));
252+
else System.out.printf("El ID: %d no existe en el árbol!%n", id2);
253+
} else System.out.printf("El ID: %d no existe en el árbol!%n", id1);
254+
}
255+
256+
private void addChild(Integer parentId, Integer childId) {
257+
if (parentId.equals(childId)) System.out.printf("Los IDs: %d y %d no pueden ser iguales!%n",
258+
parentId, childId);
259+
if (people.containsKey(parentId)) {
260+
Person parent = people.get(parentId);
261+
if (parent.getPartner() == null)
262+
System.out.printf("%s no tiene pareja. Se necesita una pareja para poder tener un hijo.%n",
263+
parent.getName());
264+
else if (people.containsKey(childId)) {
265+
parent.addChild(people.get(childId));
266+
} else System.out.printf("El ID: %d del niño no existe en el árbol!%n", childId);
267+
} else System.out.printf("El ID: %d del padre/madre no existe en el árbol!%n", parentId);
268+
}
269+
270+
private void displayTree() {
271+
Set<Integer> visited = new LinkedHashSet<>();
272+
int level = 0;
273+
nivel = 0;
274+
people.values().forEach(person -> {
275+
if (person.getFather() == null && person.getMother() == null) {
276+
displayPerson(person, level, visited);
277+
}
278+
});
279+
}
280+
281+
private void displayPerson(Person person, int level, Set<Integer> visited) {
282+
if (visited.contains(person.getId()) && level == person.getLevel()) return;
283+
if (level == 0) {
284+
System.out.println("-".repeat(60));
285+
System.out.printf("Árbol #%d:%n", ++nivel);
286+
}
287+
visited.add(person.getId());
288+
person.setLevel(level);
289+
String indent1 = "\t".repeat(level) + "└> ";
290+
String indent2 = "\t".repeat(level) + " ";
291+
System.out.printf("%s%s [ID: %d]%n", indent1, person.getName(), person.getId());
292+
Person partner = person.getPartner();
293+
Set<Person> children = person.getChildren();
294+
if (partner != null) {
295+
visited.add(person.getPartner().getId());
296+
System.out.printf("%sPareja: %s [ID: %d]%n", indent2, partner.getName(), partner.getId());
297+
}
298+
if (!person.getChildren().isEmpty()) {
299+
System.out.printf("%sHijos:%n", indent2);
300+
children.forEach(child -> {
301+
child.setLevel(level);
302+
displayPerson(child, level + 1, visited);
303+
});
304+
}
305+
}
306+
}
307+
}

0 commit comments

Comments
 (0)