gpt4 book ai didi

java - 重新排列 ArrayList 的顺序

转载 作者:行者123 更新时间:2023-12-01 07:05:11 27 4
gpt4 key购买 nike

我想通过迭代 ArrayList 并将每个元素复制到新列表中的特定位置来重新排列它。

在本例中,我想将一个元素移动到列表的末尾。例如,如果列表为 ABCDE 并且 j == B,则新列表应为 ACDEB。

这是我的代码:

private ArrayList<Job> schedule;
private ArrayList<Job> tempSchedule;

...

schedule = input;
tempSchedule = new ArrayList<Job>(schedule.size());

...

private void moveJob(int j) {
for(int i = 0; i < schedule.size(); i++) {
if(i == j) { //move to the end
tempSchedule.set(schedule.size()-1, schedule.get(i));
} else {
if(i > j && i <= schedule.size() -1) { //move one position back
tempSchedule.set(i - 1, schedule.get(i));
} else { //same position
tempSchedule.set(i, schedule.get(i));
}
}
}
schedule = tempSchedule;
u++;
}

现在我在 tempSchedule.set 处收到 IndexOutOfBoundsException: Index: 0, Size: 0

我猜问题出在这一行

tempSchedule = new ArrayList<Job>(schedule.size());

另请解释如何进行深复制。

编辑:感谢您的所有回答。我通过简单地删除该项目并在最后添加它来运行它,就像建议的那样。

我想构建一个新列表的原因是因为我可能需要在某些时候进行更复杂的重新排列。

最佳答案

首先,阅读有关 ArrayList 和集合的 javadoc。

new ArrayList(capacity) 不会复制,它只是分配具有该容量的列表。要复制列表(它不是克隆,它是引用副本,您再次需要回到基础知识)将是 new ArrayList(oldArrayList)。

其次,您的测试的大小为 0,因此其中没有对象,因此 get(0) (正确且符合规范)会抛出索引越界异常,因为您的列表为空。

除此之外,set 和 get 都不会修改列表,因此,如果您正确创建了副本并且其内容为 ABCD 并且执行了该操作,则其内容将为 ABCB。你想要的是。

X = tempSchedule.remove(i) // removes element at I
tempSchedule.add(X) // adds element to end of list

关于java - 重新排列 ArrayList 的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27040446/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com