Java 将一个arraylist数据拆分为4个独立arraylist的最有效方法?
我目前正在编写包含arraylist的代码。此arraylist包含名称、姓氏、作业和id等数据。我需要将这些数据拆分为不同的arraylist。目前我使用的方法如下所示Java 将一个arraylist数据拆分为4个独立arraylist的最有效方法?,java,loops,for-loop,arraylist,Java,Loops,For Loop,Arraylist,我目前正在编写包含arraylist的代码。此arraylist包含名称、姓氏、作业和id等数据。我需要将这些数据拆分为不同的arraylist。目前我使用的方法如下所示 for (int i = 0; i < details.size(); i = i + 4) { names.add(details.get(i)); lastname.add(details.get(i + 1)); job.add(details.get(i + 2)); id.add
for (int i = 0; i < details.size(); i = i + 4) {
names.add(details.get(i));
lastname.add(details.get(i + 1));
job.add(details.get(i + 2));
id.add(details.get(i+3));
}
for(int i=0;i
我想知道是否有更好的方法。初始arraylist可能很长,我不知道此方法是否存在任何问题。主要问题是您的详细信息可能缺少数据。例如,它的大小为5。然后你的方法会被IndexOutOfBounds压碎。您的详细信息列表应该包含一个Person对象,该对象包含您想要的所有详细信息,然后仅使用它们来填充其他列表。主要的性能损失将是
添加操作,因为它必须随时间增长数据结构。因为您知道details.size()
所以应该使用details.size()/4
初始化其他数组列表
您还应该在for循环之前检查details.size()%4==0
。如果不是,则意味着您的数据有点错误,您肯定会运行到索引自动边界
为了正确起见,您应该编写i
作为您的条件,因为您将访问for主体中的元素i+3
。您应该始终检查i
如果您在正文中访问i+x
,请这样做。(对于身体中最大的x)你问:“我想知道是否有更好的方法来做到这一点。”。有更好的办法
iMHO,您应该考虑创建一个名为Read的类,该类包含数据(名称、姓氏、作业和ID),并创建一个数组列表。然后,您可以使用Record getter方法来获取所需的数据项(并可能将其存储在不同的列表中),而不是使用索引位置(并可能获取错误的数据项)
步骤1:创建记录
类:
public class Record
{
private String firstName;
private String lastName;
private String job;
private String id;
// TODO add constructor(s), getters and setters
}
步骤2:创建一个记录列表
(这是一个更好的选择,可以创建一个在不同索引位置包含信息的列表。这样,每个名称、姓氏、作业和ID集都将是自包含的,这比列表中不同索引位置的分离要好得多
ArrayList<Record> records = new ArrayList<Record>();
如果使用<代码> map <代码>,需要考虑的一些事情。如果尝试用现有的键创建一个新条目,旧的将被重写。
jobs.put("ABC123", new Record("John", "Doe", "Fix Drywall");
jobs.put("ABC123", new Record("Bill", "Smith", "Install Light Fixtures"); //Overwrote the previous entry because key is the same
如果要更改现有值的键,必须获取该值,临时存储,删除旧记录,并使用旧临时值创建新条目:
jobs.put("ABC123", new Record("John", "Doe", "Fix Drywall");
Record rec = jobs.remove("ABC123"); // gets the record and removes old entry
jobs.put("321CBA", rec); // new job ID for old record
我希望这有帮助。应该是names.add(details.get(I))
你越界了。为什么不使用Person
对象,带有name
、lastname
、job
和id
属性?在给定条件下对我来说足够有效,但这仅仅是因为它是一个ArrayList。例如,如果它是一个LinkedList,我会使用不同的方法。
jobs.put("ABC123", new Record("John", "Doe", "Fix Drywall");
jobs.put("ABC123", new Record("Bill", "Smith", "Install Light Fixtures"); //Overwrote the previous entry because key is the same
jobs.put("ABC123", new Record("John", "Doe", "Fix Drywall");
Record rec = jobs.remove("ABC123"); // gets the record and removes old entry
jobs.put("321CBA", rec); // new job ID for old record