Cześć, mam klasę o nazwie HierarchyBuilder<TItem>, której parametr typu będzie ograniczał się tylko do klas implementujących interfejs IHaveHierarchicalStructure<TItem> posiadający następujące metody:
public interface IHaveHierarchicalStructure<TItem> {
void setParent(TItem geography);
List<TItem> getChildren();
TItem getParent();
int getId();
Integer getParentId();
}
Jedną z takich klas jest Geography przedstawiona poniżej:
public class Geography implements IHaveHierarchicalStructure<Geography> {
private int id;
private String name;
private String type;
private String code;
private Integer parentId;
private Geography parent;
private List<Geography> children = new ArrayList<>();
@Override
public void setParent(Geography parent) {
this.parent = parent;
}
@Override
public List<Geography> getChildren() {
return children;
}
@Override
public Geography getParent() {
return parent;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
}
Klasa HierarchyBuilder ma posiadać następujące metody:
HierarchyBuilder<Geography> geographyHierarchyBuilder = new HierarchyBuilder<>();
geographyHierarchyBuilder.setElements(geographies); //Niech builder przyjmie kolekcje geografii wygenerowany wcześniej
geographyHierarchyBuilder.buildHierarchy(); // niech zbuduje hierarchie
Geography rootGeography = geographyHierarchyBuilder.getRootElement();// niech zwróci rodzica wszystkichj geografii, czyli 'world'
Oto moja próba implementacji tych metod, niestety, nie jest ona poprawna:
public class HierarchyBuilder<TItem extends IHaveHierarchicalStructure<TItem>> {
private List<TItem> items;
public void setElements(List<TItem> items) {
this.items = items;
}
public void buildHierarchy() {
for (TItem item : items) {
for (TItem children : item.getChildren())
if(children.getParentId() == null) {
children.setParent(null);
} else {
if(children.getParentId() == item.getId())
children.setParent(item);
}
}
}
public TItem getRootElement() {
TItem world = null;
for (TItem item : items) {
if(world == null || item.getChildren().size() > world.getChildren().size()) {
world = item;
}
}
return world;
}
}
Domyślam się, że błąd w metodzie buildHierarchy() polega na tym, że tą drugą pętlą foreach przeszukujemy pustą listę, ponieważ na początku nigdzie nie dodajemy elementów do listy children. Problem polega na tym, że nie wiem w jaki sposób to zrobić. Czy ktoś byłby w stanie pomóc mi w tym zadaniu? Z góry dziękuję.