#java #linked-list #queue #doubly-linked-list
#java #связанный список #очередь #дважды связанный список
Вопрос:
У меня много проблем с назначением для моего класса структур данных. Мне нужно реализовать очередь с двойным приоритетом, используя список с двойной связью, но в коде, который мой профессор предоставил для его тестирования, есть некоторые странные вещи. Часть, которую я не понимаю, заключается в том, почему он использует DoubleEndedPriorityQueue, но затем добавляет объекты вместо целых чисел. Ошибка, которую я получаю, заключается в том, что нет метода add(object), который является true.
public class Test1ForAssign2 {
public static void main(final String[] args) {
final DoubleEndedPriorityQueue<Integer> sampleL = (DoubleEndedPriorityQueue<Integer>)new ListDoubleEndedPriorityQueue();
sampleL.add((Object)5);
sampleL.add((Object)12);
sampleL.add((Object)5);
sampleL.add((Object)1);
sampleL.add((Object)(-7));
sampleL.add((Object)3);
System.out.println("Priority Queue Contents: ");
System.out.println("Deleting: " sampleL.deleteMin());
System.out.println("Deleting: " sampleL.deleteMax());
}
public interface DoubleEndedPriorityQueue<AnyType>{
void makeEmpty ( );
void add (AnyType x);
AnyType deleteMin ( );
AnyType deleteMax ( );
AnyType findMin ( );
AnyType findMax ( );
boolean isEmpty ( );
}
Ответ №1:
Как вы говорите, этот код в настоящее время не компилируется — вам нужно либо преобразовать sampleL
в a DoubleEndedPriorityQueue<Object>
, либо вместо этого преобразовать целые числа в Integer:
sampleL.add((Integer)5);
Есть также более приятный способ получить типы оболочек:
sampleL.add(Integer.valueOf(5));
Я думаю, что целью здесь, вероятно, было избежать неявной автоматической упаковки — java автоматически преобразует между типами-оболочками и примитивами, но хорошо бы сделать это явным. Особенно там, где речь идет о дженериках, это может привести к путанице, и (особенно при обучении) хорошо не полагаться на эти ярлыки.
Комментарии:
1. Спасибо @hugh, это то, что я подумал. кстати, не могли бы вы помочь мне с чем-то еще? он также дал нам этот код: собственный компаратор<? super anyType> cmp; частный узел <anyType> first = null; частный узел <anyType> last = null; но я понятия не имею, как использовать компаратор, я пытался сделать cmp.compare(obj1, obj2), но это всегда дает мне исключение с нулевой точкой, и я уверен, чточто оба объекта не равны нулю. Я думаю, это потому, что класс Integer не реализует comparator, но тогда как он ожидает, что мы это сделаем?
2. (Как правило, размещать несколько вопросов в одном месте — плохая практика, но я постараюсь дать несколько советов) Integer не реализует Comparator , но он реализует Comparable — если вы ищете их, вы сможете найти статьи о том, как они отличаются.
compare
может вызывать NPE, если любой из аргументов равен нулю, в противном случае это звучит так, как будто код вcompare
неверен (вероятно, использует поле с нулевым значением без проверки на нуль). Используете ли вы отладчик? Использование одного сделает вашу жизнь намного лучше.