尝试从ArrayList访问数组

时间:2016-04-08 18:13:17

标签: java arrays sorting arraylist

我正在尝试从我的ArrayList中对数组进行排序:

    ArrayList<Integer> al = new ArrayList<Integer>();
    al.insert(0, 4);
    al.insert(1, 3);
    al.insert(2, 2);
    al.insert(3, 1);

    SelectionSortWrappers<Integer> ss = new SelectionSortWrappers<Integer>();
    ss.sort(al.elements);
    ss.show(al.elements);

但是当我尝试访问al.elements时,我得到了:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;

这是我的SelectionSort类:

public class SelectionSortWrappers<T>{

    public <T extends Comparable<? super T>> void sort(T[] array){
        int index;
        for(int i = 0 ; i < array.length;i++){
            index = i;
            for(int j = i + 1; j < array.length; j++){
                if (array[j].compareTo(array[index]) < 0){
                     index = j;
                }
            }

            T smaller = array[index];
            array[index] = array[i];
            array[i] = smaller;
        }

    }

    public void show(T[] array){
        for(int i=0; i < array.length; i++){
            System.out.print(array[i] + " ");
        }
    }

}

My ArrayList,我必须创建,因为是我的大学项目,我不能使用Java。

package Lists;

public class ArrayList<T> implements List<T> {

private static int MAX_SIZE = 10;   
private static final int NOT_FOUND = -1;            


public T[] elements;

protected int size; 

public ArrayList() {
    size = 0;
    elements = (T[]) new Object[MAX_SIZE]; 
}
public T[] getArray(){
    return elements;
}

public int find(T v) {
    for(int i = 0; i < size; i++) {
        if(v == elements[i]) {
            return i;
        }
    }
    return NOT_FOUND;
}


public T elementAt(int pos)  {
    if(pos >= 0 && pos < size) {
       return elements[pos];
    }
    throw new InvalidArgumentException();
}


public void insert(int pos, T v) {
    if (size == MAX_SIZE){
        elements = Arrays.copyOf(elements, size * 2);
        MAX_SIZE = size * 2;
    }

    if(pos == size) {
        elements[size] = v; 
    }
    else { 
        for(int i = size; i > pos; i--) {
            elements[i] = elements[i-1];
        }
        elements[pos] = v;
    }
    size++;

}


public void remove(int pos) {
    if(pos >= 0 && pos < size) {
        for(int i = pos; i < size-1; i++) {
            elements[i] = elements[i+1];
        }
        size--;
    }
    else {
        throw new InvalidArgumentException();
    }
}


public int size() {
    return size; 
}

public void show(boolean reverse) {
    if (!reverse){
        for(int i=0; i < size; i++){
            System.out.print(elements[i] + " ");
        }
    } else {
        for(int i=size; i >= 0; i--){
            System.out.print(elements[i] + " ");
        }
    }
}

}

问题出在哪里?我的elements字段是公开的。

1 个答案:

答案 0 :(得分:1)

您正在遇到由(T[]) new Object[MAX_SIZE]引起的可预测的擦除与阵列问题。您将在该行收到警告 - 该警告正在警告您这个问题。

您的ArrayList班级假装 Object[]T[],但实际上并非 - 实际引用的数组仍然是Object[]。当您使用al.elements将其拉出时,它会尝试将其强制转换为Integer[]并失败。

你必须做一些丑陋的事情来解决这个问题 - 比如内置的java.util.Collection.toArray(T[])必须要做的事情。或者,您可以编写排序方法来直接访问ArrayList,而不是尝试处理其底层数组。