Задать вопрос
@Rocket_Sk

Как добавить элементы коллекций в элемент этой же коллекции?

Делаю программу по паттерну компоновщик (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));
            }
        }
    }
}
  • Вопрос задан
  • 88 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы