将元素移动到java数组的末尾

时间:2021-06-01 07:58:32

标签: java algorithm

在 algoexpert 中解决一些问题并获得奇怪的索引超出范围异常:

问题只是取一个数组和另一个 int 并将所有等于这个 int 的数字放在数组的末尾,如下所示:

数组:[2, 1, 2, 2, 2, 3, 4, 2] 整数 toMove: 2

输出:[1,3,4,2,2,2,2,2]

所以我写了这个算法:

class Program {
  public static List<Integer> moveElementToEnd(List<Integer> array, int toMove) {
    // Write your code here.
        int newArr[] = new int[array.size()];
        int lastIndertedNotToMoveIdx = 0;
        int endOfArrayIdx = array.size();
        // ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i <= array.size(); i++) {
            if (array.get(i) == toMove) {
                newArr[endOfArrayIdx] = array.get(i);
                    endOfArrayIdx = endOfArrayIdx-1;
            } else {
                newArr[lastIndertedNotToMoveIdx] = array.get(i);
                lastIndertedNotToMoveIdx++;
            }
        }
                
      List<Integer> ret_list = new ArrayList<Integer>();
      for(Integer num:newArr) {
         ret_list.add(num);
      }
    return ret_list;
  }
}

但在这里newArr[endOfArrayIdx] = array.get(i);我收到这条消息:

java.lang.ArrayIndexOutOfBoundsException: Index 8 out of bounds for length 8
    at Program.moveElementToEnd(Program.java:12)
    at AeJsonTest.getActual(AeJsonTest.java:27)
    at Main.main(Main.java:57)

不知道为什么...

3 个答案:

答案 0 :(得分:1)

endOfArrayIdx 应该从 array.size() - 1 开始,而不是从 array.size() 开始,后者是数组的长度。数组的长度始终是数组的无效索引。

此外,for 循环条件应该是 i < array.size(),而不是 i <= array.size()

答案 1 :(得分:0)

newArr[endOfArrayIdx] = array.get(i);

应该是:

newArr[endOfArrayIdx - 1] = array.get(i);

Java 中的数组从 0 到长度 - 1。

答案 2 :(得分:0)

既然你有清单,那就用吧!这会比你做的要容易得多。并且您“奇怪的 IndexOutOfBoundException”的风险将降低。

  static List<Integer> moveElementToEnd(List<Integer> array, int toMove) {
    for (int i = 0, lastElementIndex = array.size() - 1; i <= lastElementIndex; ) {
      if (array.get(i) == toMove) {
        array.remove(i);
        array.add(toMove);
        lastElementIndex--;
      } else {
        i++;
      }
    }
    return array;
  }

另一种方法是根本不触摸输入列表。在这里你甚至没有任何索引!

  static List<Integer> moveElementToEnd(List<Integer> array, int toMove) {
    List<Integer> head = new ArrayList<>();
    int toMoveCount = 0;
    for (int value : array) {
      if (value == toMove) {
        toMoveCount++;
      } else {
        head.add(value);
      }
    }
    head.addAll(Collections.nCopies(toMoveCount, toMove));
    return head;
  }