Конструктор просто должен инициализировать Element[]
:
public PriorityQueue() {
data = new Element[SIZE];
}
Теперь put()
. Этот метод создает ArrayOutOfBoundsException
в цикле while
, поскольку вы начинаете с i = len - 1
, которое является последним полем data
. Затем вы получаете доступ к data[i+1]
, который не существует, и будет выдано исключение (если, конечно, вы не инициализируете его с data = new Element[SIZE + 1]
).
Решение: просто используйте i
и i-1
:
boolean put(Element element) {
if (len == SIZE) {
return false;
} else {
// EDIT: I changed i = len - 1 to i = len since, otherwise,
// the last element would always be overwritten. Now, the
// last element gets copied to the first "free" element and
// so on.
i = len;
while (i > 0 && element.getPriority() > data[i-1].getPriority()) {
data[i] = data[i - 1];
i--;
}
data[i] = element;
len++;
return true;
}
}
РЕДАКТИРОВАТЬ: Я уже говорил, что будет возвращен элемент с наименьшим приоритетом. На самом деле, это наибольший .
Метод get()
ведет себя так, как ожидалось (за исключением того, что он должен сказать Element x = data[0]
вместо q[0]
в начале). Он возвращает первый элемент массива (тот, который имеет наибольшее значение getPriority()
) и перемещает остальные на один индекс вниз. Однако, если вы хотите, чтобы элемент с наименьшим значением был возвращен, просто переключите >
на <
в цикле while
метода put()
:
while (i > 0 && element.getPriority() < data[i-1].getPriority()) {
...
}
И, наконец, метод toString()
. Это выглядит в основном правильно, за исключением цикла for-each. Этот всегда выполняет итерацию по всему массиву , где он должен повторяться только до data[len - 1]
. Итак, просто используйте вместо этого индекс, и у вас все будет хорошо:
public String toString() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++) {
sb.append(data[i]).append(",");
}
if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
В качестве альтернативы, если у вас установлена хотя бы Java 8, вы можете использовать потоки для этого метода:
public String toString() {
return Arrays.asList(data).stream()
.limit(len)
.map(Element::toString)
.collect(Collectors.joining(","));
}