#java
#java
Вопрос:
Я пытаюсь создать ADT очереди приоритетов с нуля, используя реализацию связанного списка. В очередь приоритетов мне нужно вставить задания, и задания должны выполняться в порядке приоритета. Приоритетный ADT, который я создал, был взят из моей книги по Java, и мой класс Job был создан мной. Я могу вставить все задания в очередь приоритетов, но когда я пытаюсь removeMin(), я получаю класс cannot cast… ошибка.
Это мой метод получения массива, помещения их в очередь и их удаления.
public static void executeJobs(Job[] jobInputArray) {
SortedPriorityQueue pq = new SortedPriorityQueue();
for(int j = 0; j < jobInputArray.length; j ) {
pq.insert(jobInputArray[j].getFinalPriority(), jobInputArray[j]);
jobInputArray[j].setEntryTime(j 1);
}
int cycles = 0;
while(!pq.isEmpty()) {
Job currentJob = (Job) pq.removeMin();
System.out.println(currentJob.getJobName());
}
}
Проблема возникает в моей строке: Job CurrentJob = (Job) pq.removeMin(); .
Это мой класс SortedPriorityQueue:
public static class SortedPriorityQueue<K,V> extends AbstractPriorityQueue<K,V>{
private PositionalList<Entry<K,V>> list = new LinkedPositionalList<>();
public SortedPriorityQueue() { super(); }
public SortedPriorityQueue(Comparator<K> comp) {super(comp);}
public Entry<K,V> insert(K key, V value) throws IllegalArgumentException{
checkKey(key);
Entry<K,V> newest = new PQEntry<>(key,value);
Position<Entry<K,V>> walk = list.last();
while(walk != null amp;amp; compare(newest, walk.getElement()) < 0)
walk = list.before(walk);
if(walk == null)
list.addFirst(newest);
else
list.addAfter(walk, newest);
return newest;
}
public Entry<K,V> min(){
if (list.isEmpty()) return null;
return list.first().getElement();
}
public Entry<K,V> removeMin(){
if(list.isEmpty()) return null;
return list.remove(list.first());
}
public int size() {return list.size();}
}
Любая помощь приветствуется.. заранее спасибо!
Комментарии:
1. Пожалуйста, добавьте точное сообщение об ошибке к вашему вопросу.
2. Исключение в потоке «main» java.lang. ClassCastException: класс helloworld.helpers $AbstractPriorityQueue $PQEntry не может быть приведен к классу helloworld. Задание (helloworld.helpers$AbstractPriorityQueue $PQEntry и helloworld. Задание находится в неназванном модуле загрузчика ‘app’)
3. Какой тип возвращает removeMin? Для чего в вашем случае создаются экземпляры K и V?
Ответ №1:
removeMin
возвращает an Entry<K,V>
, а не a Job
. Он не может быть приведен к Job
. Реализация for Entry
отсутствует, но я предполагаю, что у нее есть value()
getValue()
метод or:
Job currentJob = (Job) pq.removeMin().getValue();
Комментарии:
1. святое дерьмо, я такой глупый… Я буквально играл с этим весь день. Я не знаю, почему он не щелкнул со мной
2. @FalseOccasion если вы создаете экземпляр своей очереди с
new SortedPriorityQueue<KeyType, Job>()
помощью, то вам вообще не нужно приводить.getValue()
уже вернул бы правильный тип. Не используйте необработанные типы, если вы можете их избежать.3. Попался! Быстрый вопрос, но есть ли способ перебрать очередь приоритетов, которую я создал для поиска значения с использованием расширенного цикла for?
4. @FalseOccasion: пусть ваш класс реализует
Iterable
интерфейс