Java добавить в созданный список в зависимости от условия else создать новый список

#java

#java

Вопрос:

Надеюсь, у вас все отлично.

Прошу прощения за название, но английский не мой родной язык, и я не знаю, как лучше выразить свою проблему. Итак, в основном у меня есть проект, в котором мы создадим планировщик проектов, который в основном состоит в разделении проектов на подпроекты и задачи. Сейчас я работаю над частью подпроекта, где я хочу отобразить задачи с одинаковыми идентификаторами подпроектов в таблице HTML.
Я создал SQL-запрос, который собирает subprojectname subprojectid и taskname, которые объединяются по subprojectid и упорядочиваются по subprojectid, tasks. Теперь я хочу добавить это в ArrayList подпроектов, конструктор которых имеет список задач. Ниже приведен мой код.

 public SubProject(int subProjectID, String subProjectName, ArrayList<Task> tasks){
    this.subProjectName = subProjectName;
    this.subProjectID = subProjectID;
    this.tasks = tasks;
}
public Task(String taskName) {
    this.taskName = taskName;
}
 

Выше приведены мои классы моделей для задач и подпроектов.

 public ArrayList<SubProject> getEntireSubProject(){
    ArrayList<SubProject> listToReturn = new ArrayList<>();
    ArrayList<Task> listOfTask = new ArrayList<>();

    try {
        PreparedStatement ps = connection.establishConnection().prepareStatement("select idsubprojects, subprojectname, taskName n"  
                "from subprojects n"  
                "inner join tasks n"  
                "on subprojects.idsubprojects = tasks.subprojectidn"  
                "order by idsubprojects, idtasks");

        ResultSet rs = ps.executeQuery();

        int SPIDcompare = -1;
        while (rs.next()){
            if(SPIDcompare == rs.getInt(1)){
                listOfTask.add(new Task(rs.getString(3)));
                listToReturn.add(new SubProject(rs.getInt(1), rs.getString(2), listOfTask));
            }else{
                SPIDcompare = rs.getInt(1);
                listOfTask.add(new Task(rs.getString(3)));
                listToReturn.add(new SubProject(rs.getInt(1), rs.getString(2), listOfTask));
            }
        }

    } catch (SQLException e) {
        e.printStackTrace();
    }
    return listToReturn;
}
 

Выше приведен мой класс репозитория, в котором я пытаюсь добавить данные SQL в списки. Вывод SQL-запроса:
‘4’,’spName’,’TaskName’
‘4’,’spName’,’TaskName’
‘4’,’spName’,’TaskName’
‘4’,’spName’,’TaskName’
‘6’,’subProjectTest’,’Test’
‘8’,’Все еще работает?’,’doSomething’

Все это записи, которые я сделал. Чего я хочу добиться, так это добавить все задачи, в которых SPID (subprojectid) совпадает с одним и тем же объектом подпроекта, и если SPID изменится, я хотел бы создать новый объект подпроекта в списке для добавления этих данных. Очевидно, что я делаю это неправильно прямо сейчас, так как когда SPID == rs.getInt(1) я создаю новый объект подпроекта, но я действительно не могу понять, как это сделать. Я надеюсь, что кто-нибудь сможет мне помочь

Результатом, которого я пытаюсь достичь, является arraylist, который содержит x количество подпроектов с его subprojectID и соответствующим subprojectname, а также список задач. Итак, с записями из моей базы данных, которые я написал выше, я бы ожидал следующего arraylist

ArrayList(
подпроект (4, spName, ArrayList(TaskName, TaskName, TaskName, TaskName, TaskName))
Подпроект (6, subProjectTest, ArrayList(Test))
Подпроект (8, все еще работает?, ArrayList(doSomething)))

Я хочу, чтобы этот список подпроектов отображался в таблице HTML следующим образом: Подпроект

РЕДАКТИРОВАТЬ: с помощью @TimonNetherlands я создал представление, которое выглядит следующим образом. Я хочу видеть таблицу HTML thymeleaf для каждого подпроекта, где каждая строка представляет собой одну задачу. Прямо сейчас я могу сделать так, чтобы это выглядело следующим образом с помощью этого кода:

EDIT2: я перепутал thymeleaf, он работает. Благодаря @TimonNetherlands

 <div th:if=${!#lists.isEmpty(test)} class="taskTable">
    <div th:each="test : ${test}">
        <table class="showTasks" >
            <tr>
                <th>Sub project name</th>
                <th>Task name</th>
            </tr>
            <tr th:each="test1 : ${test.tasks}">
                <td th:text="${test.subProjectName}"></td>
                <td th:text="${test1.taskName}"></td>

            </tr>
        </table>
    </div>
</div>
 

введите описание изображения здесь

Комментарии:

1. Не могли бы вы рассказать подробнее о своем ожидаемом результате? Каким вы ожидаете результата?

2. Конечно, извините! Я отредактировал исходное сообщение

Ответ №1:

SPIDcompare == rs.getInt(1) никогда не будет true .

Удалить

 ArrayList<Task> listOfTask = new ArrayList<>();
 

Изменить

     int SPIDcompare = -1;
    while (rs.next()){
        if(SPIDcompare == rs.getInt(1)){
            listOfTask.add(new Task(rs.getString(3)));
            listToReturn.add(new SubProject(rs.getInt(1), rs.getString(2), listOfTask));
        }else{
            SPIDcompare = rs.getInt(1);
            listOfTask.add(new Task(rs.getString(3)));
            listToReturn.add(new SubProject(rs.getInt(1), rs.getString(2), listOfTask));
        }
    }
 

в:

     while (rs.next()){
        SubProject subProject = getSubProject(rs.getInt(1), listToReturn);
        if( subProject == null ){
            ArrayList<Task> listOfTask = new ArrayList<>();
            listOfTask.add(new Task(rs.getString(3)));
            listToReturn.add(new SubProject(rs.getInt(1), rs.getString(2), listOfTask));
        }else{
            subProject.getTasks().add( new Task(rs.getString(3) ); 
            // or subProject.tasks.add( new Task(rs.getString(3) ) if you don't have a getter
        }
    }
 

Добавьте этот метод:

     private SubProject getSubProject( int subProjectID, List<SubProject> subProjects) {
        return subProjects.stream()
                // change 'p.getSubProjectID()' into 'p.subProjectID' if you don't have a getter
                .filter( p -> p.getSubProjectID() == subProjectID )
                .findFirst()
                .orElse( null );
    }

 

Комментарии:

1. Привет, Тимон, и спасибо за ваш ответ! Я попытался реализовать ваш код. Я поместил getSubProject в свой класс репозитория — это правильно? Если это так, он возвращает null .

2. Я также обновил исходное сообщение тем, что я ожидаю в качестве результата, если это изменит ваши мысли

3. Я допустил ошибку ввода. Я написал subProjectId вместо subProjectID . Можете ли вы проверить, работает ли это, когда вы вносите необходимые исправления?

4. На самом деле я сам внес эти исправления в ваше первое издание ответа. К сожалению, он по-прежнему не работает и возвращает исключение нулевого указателя. Я попробую отладчик и попробую посмотреть, смогу ли я определить, почему

5. Вы могли бы вернуть необязательное значение в getSubProject вместо управления нулевым значением