java - 重新排列 ArrayList 的顺序

标签 java arraylist deep-copy call-by-value

我想通过迭代 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/

相关文章:

java - 使用 JAXB 解码具有不同/动态名称的元素

Java - 使用 HashMap 和 List<> 作为键

java - 使用 Java 和 Apache POI 从 Excel 读取整数数据时避免小数点

java - 设置RelativeLayout Param高度时ImageView的尺寸会缩小

java - 使用 JAXB 通过 SOAP 传递 HashMap<String,Object>

java - 如何根据 ArrayList 包含的元素的属性返回 ArrayList 中的索引

java - 为什么在Arraylist复制的时候修改,修改的是原来的呢?

r - R中的data.table就地修改

Python:浅拷贝构造函数和深拷贝构造函数的实现

c# - 如何创建 List<T> 的新深拷贝(克隆)?