Я пытаюсь создать массив 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 в порядке)
@BlackPearl, который только что это исправил. Но почему это работает, а не ясно()?




Проблема кроется здесь:
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);
}
Вместо
pList.clear();используйтеpList = new ArrayList<>();