2015-04-10 2 views
1

Вот код, который у меня есть. Я пытаюсь проверить мой BubbleSort метод ..Попытка создать и испытать сопоставимый класс arraylist

import java.util.ArrayList; 
import java.util.List; 


public class MyArrayList<T extends Comparable<? super T>> extends ArrayList<Comparable<T>> { 

private static final long serialVersionUID = 1L; 

private MyArrayList<T> myList; // class list 

public MyArrayList(ArrayList<Comparable<T>> asList) { 
    for (Comparable<T> e: asList) { 
     myList.add(e); 
    } 
} 

public void bubbleSort() { 
    boolean swapped = true; 

    while (swapped) { 
     swapped = false; 
     for (int i = 0; i < this.size() - 1; i++) { 
      if (this.get(i).compareTo((T) this.get(i + 1)) > 0) { 
       swapped = true; 
       Comparable<T> temp = this.get(i); 
       this.set(i, this.get(i + 1)); 
       this.set(i + 1, temp); 
      } 
     } 
    } 
} 
} 

В моем тестовом классе, у меня возникают проблемы при создании списков, чтобы проверить мой метод BubbleSort. Я хочу попытаться создать список Integer (из массива), список строк и несколько других, но я продолжаю получать различные ошибки.

import static org.junit.Assert.*; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collection; 

import org.junit.Test; 


public class MyArrayListTest<T> { 

public void setUp() { 
    Integer[] testIntArray = new Integer[]{0, 1, 2, 3}; 
    MyArrayList<Integer> myList = new MyArrayList<Integer>(Arrays.asList(testIntArray)); 
} 
} 

Любые идеи, почему это не работает, и как я буду создавать MyArrayList?

+1

Почему экземпляру MyArrayList нужен другой экземпляр MyArrayList для работы? Получает ли метод get() ArrayList поиск элементов в 'myList'? –

+0

Идея заключалась в том, чтобы создать объект MyArrayList, а затем просто вызвать на него .bubbleSort. Я создал конструктор, потому что я не мог найти способ не использовать его. – glcohen

+1

Наличие конструктора - это не проблема, которую я пытаюсь вам показать. Наличие поля myList - это то, что не имеет смысла. Здесь вы занимаетесь наследованием, а не композицией. –

ответ

3

Вы должны изменить свой конструктор из:

public MyArrayList(ArrayList<Comparable<T>> asList) 

к:

public MyArrayList(List<T> asList) 

Arrays.asList не возвращает java.util.ArrayList, поэтому new MyArrayList<Integer>(Arrays.asList(testIntArray)) не компилируется. Arrays.asList возвращает экземпляр вложенного класса, определенного в классе Arrays, который также называется ArrayList, но что более важно, возвращаемый тип Arrays.asList(T... a) - List<T>.

+0

Я уверен, что добавление этой части не повредит **. Java.util.Arrays.asList (T ... a) возвращает список фиксированного размера, поддерживаемый указанным массивом. (Изменения в возвращенном списке «write through» в массив.) Этот метод действует как мост между API-интерфейсами на основе массивов и коллекций, ** –

+0

Правильно, но на самом деле конкретный класс возвращаемого списка не имеет значения , Весь компилятор заботится о * объявленном * возвратном типе asList(): List. –

+0

Я внес изменения, но все равно получаю сообщение об ошибке. Eclipse говорит мне: «Конструктор MyArrayList (Список ) - это undefined». – glcohen

3

Несколько проблем здесь.

Прежде всего, как только вы объявили базовый тип списка сопоставимым, вы больше не должны использовать Comparable<T>. На самом деле это разрушает ваш конструктор. Он ожидает список Comparable чего-то и получает список Integer. Хотя Integer является Comparable, List<Integer> является не a List<Comparator>. Это два разных типа.


Во-вторых, как вы сказали, метод Arrays.asList() возвращает List и это не уступка, совместимый с ArrayList без приведения типа (и не сможет на кастинге типа, потому что это не java.util.ArrayList).

Так декларация конструктора должен быть на самом деле

public MyArrayList(List<T> asList) 

И ваша петля переменной e также должен быть объявлен как T. Основной факт заключается в том, что Java уже знает, что T расширяет Comparable, поэтому он знает, что у него есть метод compareTo().


Но у вас также есть логическая ошибка, с которой вы пока не сталкивались из-за объявления конструктора. У вас на самом деле есть две коллекции в MyArrayList. Первый - поле myList, а другое - this. Поскольку вы распространяете ArrayList, thisявляетсяArrayList.

В вашем конструкторе вы добавляете данные в myList. Но в вашем методе сортировки вы сравниваете и обмениваете данные в this!Это означает, что он, вероятно, попытается отсортировать пустой список, так как вы не заполнили его в конструкторе (если вы не вызвали его метод add из вашего основного).

В самом деле, добавление информации в myList, вероятно, бросить NullPointerException как вы не инициализировать myList и у Вас нет никакого способа сделать это, так как это MyArrayList, и имеет только конструктор List на основе, который, если вы будете используйте, вы отправите вас на бесконечный цикл и получите переполнение стека.


Сам список, вероятно, следует расширить ArrayList<T>, а не ArrayList<Comparable<T>>. Опять же, T, как известно, расширяет Comparable. И тогда вы можете объявить переменную tempT, а не Comparable<T>. Также не следует включать аргумент в T, поскольку он уже будет T, являясь базовым типом this.

Смежные вопросы