反转列表引发indexoutofboundsexception

kadbb459  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(383)

该方法应该反转列表中项目的顺序

public class ZrcalnaSlikaSeznama {
    public static <T> List<T> zrcalnaSlika(List<T> seznam) {
        int length = seznam.size();
        List<T> seznam2 = new ArrayList<>();
        for (T x : seznam){
            seznam2.add(length-1, x);
            length--;
        }
        return seznam2;
    }
}

但它抛出 IndexOutOfBoundsException . 为什么?如何修正这个方法?

c90pui9n

c90pui9n1#

解释

您的代码的主要问题是,您假设可以直接将某些内容添加到 ArrayList ,使用 add(index, element) .
但它不是一个数组,而是一个列表。这是不可能的。这个 add 方法不允许添加超出其当前大小的内容,当前大小仍为 0 . 如本方法文件所述:
抛出: IndexOutOfBoundsException -如果索引超出范围 (index < 0 || index > size()) ###修复
要修复代码并继续使用这种方法,首先必须确保列表已经具有所需的大小,方法是在其前面填充垃圾数据,比如大量垃圾数据 null s。然后做你想做的事,但是用 set ,不是 add (否则您不会更改现有条目,而是将它们四处移动)。比如说:

List<T> reversed = new ArrayList<>();

// Fill with garbage
for (int i = 0; i < seznam.size(); i++) {
    reversed.add(null);
}

// Exchange against elements
int i = seznam.size() - 1;
for (T element : seznam) {
    reversed.set(i, element);
    i--;
}

合适的解决方案

显然,首先用垃圾数据填充列表并不是一种理想的方法。你可以做得更好。不如向前添加到新列表中,但向后迭代原始项。所以如果你有 [1, 2, 3] 你加上, 3 , 2 最后呢 1 . 这很容易做到:

List<T> reversed = new ArrayList<>();

for (int i = seznam.size() - 1; i >= 0; i--) {
    reversed.add(seznam.get(i));
}

注意

还有其他的方法,java也已经有了内置的方法,如果你可以选择的话。 Collections.reverse(list) .
例如,请参阅如何在java中获取列表的反向列表视图?

ttvkxqim

ttvkxqim2#

使用for-loop()反转列表中项目顺序的另一种方法是:

public class ZrcalnaSlikaSeznama {

    public static <T> List<T> zrcalnaSlika(List<T> seznam) {
        int length = seznam.size();
        List<T> seznam2 = new ArrayList<>();

        for (int i = length-1; i>=0; i--){
            seznam2.add(seznam.get(i));
        }

        return seznam2;
    }

}

相关问题