Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将一个arraylist数据拆分为4个独立arraylist的最有效方法?_Java_Loops_For Loop_Arraylist - Fatal编程技术网

Java 将一个arraylist数据拆分为4个独立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

我目前正在编写包含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(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