java根据条件添加到示例化列表,否则示例化新列表

6qqygrtg  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(328)

我希望你很棒。
关于这个题目我很抱歉,但英语不是我的第一语言,我不知道如何更好地表达我的问题。所以基本上我有一个项目,我们要做一个项目计划,基本上就是把项目分成子项目和任务。我现在正在处理子项目部分,我想在html表中显示具有相同子项目id的任务。
我做了一个sql查询,它收集subprojectname subprojectd和taskname,后者连接subprojectd并按subprojectd和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.subprojectid\n" +
                "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;
}

上面是我的repository类,我尝试将sql数据添加到列表中。sql查询输出:
'4'、'spname'、'taskname'
'4'、'spname'、'taskname'
'4'、'spname'、'taskname'
'4'、'spname'、'taskname'
'6'、'subprojecttest'、'test'
‘8’,‘还在工作?’,‘dosomething’
这些都是我写的条目。我想要实现的是将spid(subprojectd)相同的所有任务添加到同一个subproject对象中,如果spid发生了变化,那么我想在列表中创建一个新的subproject对象来添加这些数据。很明显,我现在做得不对,比如当spid==rs.getint(1)我创建了一个新的子项目对象,但是我真的不知道该怎么做。我希望有人能帮我
我试图实现的输出是一个arraylist,它包含x个子项目及其子项目和相应的子项目名,以及一个任务列表。因此,对于我上面写的数据库中的条目,我希望下面的arraylist
阵列列表(
子项目(4,spname,arraylist(taskname,taskname,taskname,taskname))
子项目(6,subprojecttest,arraylist(test))
子项目(8,stillworking?,arraylist(dosomething)))
我希望在html表格中显示子项目列表,如下所示:

编辑:在@timonnetherlands的帮助下,我完成了如下视图。我希望看到每个子项目的html thymeleaf表,其中每一行都是一个任务。现在我可以用下面的代码使它看起来像这样:
edit2:我弄乱了胸腺,它起作用了。感谢@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>

nbnkbykc

nbnkbykc1#

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 );
    }

相关问题