使用 "in situ" 反转通用数组

Reversing a Generic Array using "in situ"

对于这个通用数组,我添加了 reverse() 方法,它必须在不使用额外元素数组的情况下反转数组,并且我试图仅使用交换操作来“原位”执行反转。但我可能弄错了,如果是这样,如何仅使用交换操作“原位”逆转它?

import java.util.Collections;

class GenericArray<E> {
    private E[] array;
    private int size;

    public GenericArray() {
        array = (E[]) new Object[10];
        size = 0;
    }

    public E get(int i) {
        return array[i];
    }

    public void set(int i, E value) {
        if (i < size)
            array[i] = value;
    }

    public void add(E value) {
        array[size++] = value;
    }

    public boolean isFull() {
        return size == array.length;
    }

    public void remove(int i) {
        for (int j = i; j < size; j++)
            array[j] = array[j + 1];
        size--;
    }

    public void insert(int i, E value) {
        for (int j = size; j >= i; j--)
            array[j + 1] = array[j];
        array[i] = value;
        size++;
    }

    public void display() {
        for (int i = 0; i < size; i++)
            System.out.print(array[i] + " ");
        System.out.println();
    }

    public E reverse() {

        Collections.reverse(array);

    }

}

如果你的意思是你想在不使用 Collections.reverse 的情况下手动完成它(顺便说一句,该代码甚至不应该编译,反向需要一个 List 作为参数),只需从从开始到中间交换范围两侧的元素:

public E[] reverse() {
    for (int i = 0; i < size/2; i++){
        E tmp=array[i];  
        array[i] = array[size - i - 1];
        array[size - i - 1]=tmp;
    }
    return array; // If you really want to return it
}

有关维基百科 in situ algorithms 的更多信息。

关于确保有足够 space 的 add 实施:

public void add(E value) {
    int newsize=size+1;
    if(newsize<size){
        //The array is big enough, add the element
        array[newsize]=value;
    }else{
        //The array is too small, create a new one with
        //the old content but twice as bigger and add 
        //the new element
        array=Arrays.copyOf(array,size*2); 
        array[newsize]=value;  
    }
    size=newsize;
}

Collections.reverse()做反转"in situ";您只需要将数组作为列表提供给它:

Collections.reverse(Arrays.asList(array));