[英]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.