Я чувствую, что я слишком усложняю ситуацию, так как обнаруживаю, что существует так много граничных случаев. Это задание для университета, поэтому, пожалуйста, ТОЛЬКО ДАЙТЕ МНЕ СОВЕТЫ, а не код, который я могу скопировать/вставить. Я пытаюсь сделать очередь приоритетов, которая упорядочивает элементы, содержащие символ. Они должны быть размещены на значении приоритета, а затем в алфавитном порядке, если в приоритете есть конфликт. Проблема, которую я испытываю, - это вставить элементы. Вот код, который я в настоящее время:Как создать очередь приоритетов, которая также учитывает содержимое элемента?
public void insertItem(int priority, char content) {
boolean isSpecialCase = false;
PList current;
if (isEmpty()) {
high = new PList(priority, content, null, null);
low=high;
System.out.println(content + " has been added to an empty list");
isSpecialCase = true;
}
if (priority >= high.getPriority() && content >= high.getContent() && !isSpecialCase) {
PList newItem = new PList(priority, content, high, null);
high.setBehind(newItem);
high = newItem;
isSpecialCase = true;
System.out.println(content + " has been added to a non empty list - highest priority");
}
if (priority < low.getPriority() && !isSpecialCase) {
PList newItem = new PList(priority, content, null, low);
low.setNext(newItem);
low = newItem;
isSpecialCase = true;
System.out.println(content + " has been added to a non empty list - absolute lowest priority");
}
if (priority == low.getPriority() && content > low.getContent() && !isSpecialCase) {
PList newItem = new PList(priority, content, low, low.getBehind());
low.getBehind().setNext(newItem);
low.setBehind(newItem);
isSpecialCase = true;
System.out.println(content + " has been added to a non empty list - lowest priority-highest char");
}
if (priority == low.getPriority() && !isSpecialCase) {
if (content < low.getContent()) {
PList newItem = new PList(priority, content, null, low);
low.setNext(newItem);
low = newItem;
isSpecialCase = true;
System.out.println(content + " has been added to a non empty list -lowest priority");
}
}
current = high;
while (current.getNext() != null && !isSpecialCase) {
if (current.getPriority() >= priority) {
if (current.getContent() > content) {
PList newItem = new PList(priority, content, current.getNext(), current);
current.getNext().setBehind(newItem);
current.setNext(newItem);
break;
}
}
current = current.getNext();
}
}
кажется грязным и несколько повторяющихся так, поэтому я думаю, что я на ложном пути. Он работает в большинстве случаев, но, например, я получаю NullPointer когда я бегу:
PriQueue p = new PriQueue();
p.insertItem(5, 'a');
p.insertItem(5, 'a');
p.insertItem(4, 'x');
p.insertItem(4, 'a');
p.insertItem(4, 'x');
Есть и другие случаи, когда он просто не поставить все элементы в очереди, не давая каких-либо ошибок.
Спасибо заранее
Добавление stacktrace было бы полезно. –
Вы знакомы с [Heap] (http://ru.wikipedia.org/wiki/Heap_%28data_structure%29)? –
С помощью кучи, реализую ли я его, имея приоритет в качестве родителя, и дети будут упорядочены персонажем? – user1198778