Java создает отсортированный массив ArrayList из ArrayList

Я пытаюсь создать массив ArrayList из существующего ArrayList, который содержит все элементы из ArrayList, но отсортирован по имени проекта в массиве ArrayList. Вот визуализация моей проблемы:

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, ...]
...                  ...

Вот что я уже сделал:

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

        }
    }

Где 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"

и добавляет его в список ArrayList, возвращаемый функцией ReadData().

Но когда я вызываю ArrayList Array «separatedData», чтобы получить «имена» и «количество» для каждого «Данные», выполнив следующие действия:

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

Я получаю это:

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

что 1. только последний добавленный проект и 2. в три раза больше исходной суммы (все данные ArrayList в порядке)

Вместо pList.clear(); используйте pList = new ArrayList<>();

BlackPearl 27.04.2019 18:36

@BlackPearl, который только что это исправил. Но почему это работает, а не ясно()?

TryAngle 27.04.2019 18:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема кроется здесь:

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

}

Вы создаете только один ArrayList, на который ссылается plist, и постоянно очищаете один и тот же ArrayList в цикле for. Более того, вы добавляете ту же ссылку на ArrayList в свой separatedData. В итоге у вас есть ArrayList, содержащий несколько ссылок на один и тот же ArrayList. Как предложил @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);

}

Другие вопросы по теме