简体   繁体   English

Java从ArrayList创建排序的ArrayList数组

[英]Java create a sorted ArrayList Array from an ArrayList

I am trying to create an ArrayList Array from an existing ArrayList which contains all items from the ArrayList but sorted by the projectname in array of the ArrayList. 我正在尝试从现有ArrayList创建一个ArrayList Array,该ArrayList包含ArrayList中的所有项目,但按ArrayList数组中的项目名称排序。 Here a visualization of my problem: 这里是我的问题的可视化:

ArrayList<Data>:
[String name0, ...]
[String name0, ...]
[String name1, ...]
[String name0, ...]
[String name1, ...]
...

->

ArrayList<ArrayList<Data>>:
0. ArrayList:        1. ArrayList:        ...
[String name0, ...]  [String name1, ...]
[String name0, ...]  [String name1, ...]
[String name0, ...]
...                  ...

Here is what I have already done: 这是我已经做的:

private ArrayList<Data> data = new ArrayList<>();
private ArrayList<ArrayList<Data>> separatedData = new ArrayList<>();
private List<String> projectnames = new ArrayList<>();
private DataManager dataManager;

    public void GenerateDataArrays() throws IOException {

        //adds value to allData
        allData = dataManager.ReadData("data.csv");

        //get all project names out of the ArrayList and adds it to the 
        List projectnames
        for (Data data : allData) {
            if (!projectnames.contains(data.getProject())) {
                projectnames.add(data.getProject());
            }
        }

        //init new temporary ArrayList
        ArrayList<Data> pList = new ArrayList<>();

        //clears seperatedData because the method is called everytime a 
        //button is pressed to reload all data
        separatedData.clear();

        //looks for all Arrays in the Arraylist with the same name and 
        //adds each with an equal name to same list
        for (String name : projectnames) {
            pList.clear();
            for(Data data : allData){
                if (data.getProject().equals(name)){
                    pList.add(data);

                }
            }
            seperatedData.add(pList);

        }
    }

Where dataManager just reads a CSV file that looks like this: dataManager仅读取如下所示的CSV文件:

"name","boolean1","amount","boolean2","date1","date2","date3","shop","reason","person","boolean3"
"SampleName","false","90.0","true","29.04.2019","29.04.2019","29.04.2019","Sampleshop","SampleReason","SamplePerson","true"
"SampleName","false","10.0","false","29.04.2019","29.04.2019","29.04.2019","Sampleshop","SampleReason","SamplePerson","true"
"SampleName2","false","90.0","false","29.04.2019","29.04.2019","29.04.2019","Sampleshop2","SampleReason2","SamplePerson2","true"
"LastProject","false","90.0","false","29.04.2019","29.04.2019","29.04.2019","Sampleshop","SampleReason","SamplePerson","true"
"LastProject","false","60.0","false","29.04.2019","29.04.2019","29.04.2019","Sampleshop","SampleReason","SamplePerson","true"

and adds it to an ArrayList which is returned by ReadData(). 并将其添加到由ReadData()返回的ArrayList中。

But when I call ArrayList Array 'separatedData' to recieve the 'names' and 'amount' for each 'Data' by doing this: 但是,当我通过执行以下操作将ArrayList称为“ separatedData”以接收每个“数据”的“名称”和“数量”时:

        for (ArrayList<Data> dataAll : separatedData){
            for(Data data : dataAll){
                    System.out.println(data.getProject() + ", " + data.getAmount());
            }
        }

I recieve this: 我收到了:

LastProject, 90.0
LastProject, 60.0
LastProject, 90.0
LastProject, 60.0
LastProject, 90.0
LastProject, 60.0

which is 1. only the latest added project and 2. thrice of the initial amount (The ArrayList allData is fine) 这是1.只有最新添加的项目和2.初始金额的三倍(ArrayList allData可以)

The problem lies here : 问题就在这里:

ArrayList<Data> pList = new ArrayList<>();
separatedData.clear();
for (String name : projectnames) {
   pList.clear();
   for(Data data : allData){
        if (data.getProject().equals(name)){
             pList.add(data);

        }
    }
    seperatedData.add(pList);

}

You create just one ArrayList referenced by plist and you are constantly clearing the same ArrayList in your for loop. 您仅创建一个由plist引用的ArrayList ,并且不断在for循环中清除同一ArrayList Moreover you add the same reference to ArrayList to your separatedData . 此外,您将对ArrayList引用添加到您的separatedData In the end you have ArrayList containg multiple references to the same ArrayList . 最后,您将ArrayList包含对同一ArrayList多个引用。 As suggested by @BlackPearl the solution is to create a new list in your for loop every time : 如@BlackPearl所建议,解决方案是每次在for循环中创建一个新列表:

for (String name : projectnames) {
        ArrayList<Data> pList = new ArrayList<>();
        for(Data data : allData){
            if (data.getProject().equals(name)){
                pList.add(data);
            }
        }
        seperatedData.add(pList);

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM