Rozważmy klasę w javaZnajdź hierarchię
class Entity {
Integer id;
Integer parentId;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
}
}
Rozważmy parentId jak klucza obcego (dotyczy id do innego obiektu).
Teraz stworzyłem 6 obiektów i dodałem kilka wartości.
Entity e1 = new Entity();
e1.setId(400);
Entity e2 = new Entity();
e2.setId(300);
e2.setParentId(400);
Entity e3 = new Entity();
e3.setId(200);
e3.setParentId(300);
Entity e4 = new Entity();
e4.setId(100);
e4.setParentId(200);
Entity e5 = new Entity();
e5.setId(50);
e5.setParentId(100);
Entity e6 = new Entity();
e6.setParentId(50);
Teraz chcę uzyskać hierarchię obiektów. Oznacza to, że jeśli podam id, powinienem uzyskać pełną hierarchię nadrzędną i hierarchię potomną.
dla np: jeśli dam 100 jako identyfikator (jednostki: E4), powinienem dostać hierarchii nadrzędny: - E4, E3, E2, E1 hierarchia dziecko: - E4, E5, E6
Objaśnienie: - dla hierarchii nadrzędnej: - najpierw powinniśmy dodać początkowy obiekt e4. wtedy znajdziemy obiekt, którego ID jest takie samo, jak i ID4 rodzicielskiego e4 (tutaj e3) proces trwa do momentu, gdy parentid ma wartość null dla hierarchii potomnej: - najpierw powinniśmy dodać początkowy obiekt e4. wtedy znajdziemy obiekt, którego parentId jest taki sam jak identyfikator e4. (Tutaj E5) proces trwa aż The parentId jest null
Rozwiązanie przeze mnie dla hierarchii dominującej: -
List<Entity> parent = new ArrayList<Entity>();
Entity ent = list.stream().filter(e -> e.getId() == 100).findFirst()
.get(); // // 100 input id value
parent.add(ent);
Integer parentId = ent.getParentId();
while (parentId != null) {
int search = parentId;
Entity newEntity = list.stream().filter(e -> e.getId() == search)
.findFirst().get();
parent.add(newEntity);
parentId = newEntity.getParentId();
}
dla hierarchii dzieci:
Entity entnew = list.stream().filter(e -> e.getId() == 100).findFirst()
.get(); // 100 input id value
child.add(entnew);
Integer idNew = entnew.getId();
while (idNew != null) {
int searchNew = idNew;
Entity newEnt = list.stream().filter(f -> f.getParentId()!= null && f.getParentId() == searchNew)
.findFirst().get();
child.add(newEnt);
idNew = newEnt.getId();
}
znalazłem tę metodę aby rozwiązać scenariusz, Ale chcę bardziej wydajne rozwiązanie w java 8, używając jego podstawowych pojęć, aby rozwiązać ten problem.
czy to jest powód, dla którego zamiast "parentId" zamiast odniesienia do rodzica? – user902383