Вот реализация базового списка:
Код: Выделить всё
public class ArrayList implements ListADT {
protected T[] array;
protected int count;
private static final int DEFAULT_CAPACITY = 10;
@SuppressWarnings("unchecked")
public ArrayList() {
array = (T[]) (new Object[DEFAULT_CAPACITY]); // internal storage
count = 0;
}
protected void expandCapacity() {
array = java.util.Arrays.copyOf(array, array.length * 2);
}
}
Код: Выделить всё
public class ArrayOrderedList extends ArrayList implements OrderedListADT {
private Comparator comparator;
public ArrayOrderedList(Comparator comparator) {
this.comparator = comparator;
}
@Override
public void add(T element) {
if (count == array.length)
expandCapacity();
int i = 0;
// The error occurs here:
while (i < count && comparator.compare(element, array[i]) > 0) {
i++;
}
for (int j = count; j > i; j--) {
array[j] = array[j - 1];
}
array[i] = element;
count++;
}
}
Код: Выделить всё
public interface OrderedListADT extends ListADT {
public void add(T element);
}
Код: Выделить всё
public interface ListADT extends Iterable{
public T removeFirst();
public T removeLast();
public T remove( T Object);
public T first();
public T last();
public boolean contains(T target);
public boolean isEmpty();
public int size();
public Iterator iterator();
public String toString();
}
Код: Выделить всё
public class ArrayOrderedListDemo {
public static void main(String[] args) {
ArrayOrderedList array1 = new ArrayOrderedList(Comparator.naturalOrder());
array1.add(2);
array1.add(5);
array1.add(4);
array1.add(1);
}
}
Я ожидаю, что элементы будут вставлены в отсортированном порядке возрастания, например:
[1, 2, 4, 5]
Фактическая ошибка выполнения
Код: Выделить всё
Exception in thread "main" java.lang.ClassCastException:
class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.Comparable;
([Ljava.lang.Object; and [Ljava.lang.Comparable; are in module java.base of loader 'bootstrap')
at OrderedList.ArrayOrderedList.add(ArrayOrderedList.java:14)
at OrderedList.ArrayOrderedListDemo.main(ArrayOrderedListDemo.java:10)
Это происходит потому, что внутренний массив на самом деле является Object[], но операция сравнения косвенно предполагает, что сохраненные элементы будут находиться в Comparable[] (хотя я использую Comparator).
Ограничения
Это академическое упражнение, в котором:
Список должен быть реализован с нуля.
/>Я не могу использовать java.util.ArrayList.
Я не могу использовать отражение или Array.newInstance(...).
Я должен хранить элементы в общем массиве следующим образом:
array = (T[]) new Object[n];
Мой вопрос
Как я могу безопасно сравнивать элементы с помощью Comparator, когда они хранятся в Object[], без преобразование внутреннего массива в Comparable[] и без использования отражения?
Подробнее здесь: https://stackoverflow.com/questions/798 ... using-comp
Мобильная версия