Делаю программу по паттерну компоновщик (composite), суть такова, например пользователь вводит в консоль root/name/name.txt. Программа принимает строку, передает её другому классу который проверяет является ли первый эл-т "root/" если да (это обязательное требование, об этом далее), затем класс возвращает массив String'ов который принимает следующий класс, его я назвал Builder.
Мой компоновщик состоит из трех классов, абстрактный класс Component и два его подкласса: File(умеет только печатать своё имя), Folder(по сути и является композитом, в нем есть ArrayList).
В Builder мы создаем new Folder ("root"), с которой и проводим все операции, есть метод который принимает наш массив String'ов в нашем случае ["name", "name.txt"] и делает его коллекцией без первого эл-та в нашем случае без эл-та "root/".
И теперь суть вопроса, должен быть метод который будет проверять, если идет эл-т Folder, то последующие эл-ты коллекции уже должны добавляться в наш объект класса Folder, при чем этот объект так же должен где-то храниться, максимум в корневой коллекции root/ который так же является объектом Folder. File - наш лист, который не может ничего храниться, кол-ва объектов которые могут храниться в Folder не ограничено (условно конечно), ниже привел мой код. с которым я получаю "java.lang.IndexOutOfBoundsException"
import java.util.ArrayList;
import java.util.List;
public class Builder {
private static final String isFile = "."; //для того, чтобы находить класс
private List<Component> componentArray = new ArrayList<>(); //для перевода в созданные классы
private File file = new File(""); //для сравнения
private Folder folder = new Folder(""); // для сравнения
private Folder root = new Folder("root"); //наш корень всех папок и файлов
private StringToArray text = new StringToArray(); // объект нашего переводчика в массив
private String[] textArray = text.getArray(); // наш массив Strings
public void gettingPackage(){
doComponent(textArray);
buildTree(componentArray);
root.print();
}
private void doComponent(String[] array){
for (int i = 1; i < array.length; i++) {
if(array[i].contains(isFile)) {
componentArray.add(new File(array[i]));
} else {
componentArray.add(new Folder(array[i]));
}
}
}
private void buildTree (List<Component> rootFolder){
for (int i = 0; i < rootFolder.size(); i++) {
if(rootFolder.get(i).getClass() == folder.getClass()) {
List<Component> bufferList = new ArrayList<>();
for (int j = rootFolder.indexOf(i); j < rootFolder.size(); j++) {
rootFolder.get(i).add(rootFolder.get(j));
System.out.println("Компонент " + rootFolder.get(j) + " добавлен в папку"
+ rootFolder.get(i));
}
root.add(rootFolder.get(i));
}
}
}
}