Java PriorityQueue, кажется, меняет ранее добавленные значения при вызове add () - PullRequest
1 голос
/ 31 января 2020

Я остаюсь озадаченным, поскольку очередь приоритетов, с которой я работаю, изменяет или переупорядочивает ранее добавленные значения в al oop при добавлении новых значений. Пока это происходит только с этим тестом.

Вот некоторые фрагменты моего отладчика:

Перед добавлением 6-го элемента:

enter image description here

После добавления 6-го элемента :

enter image description here

Пример кода следующий:

package mixedobjectsset;

import java.util.PriorityQueue;
import java.util.Queue;

public class MixedObjectsSet {

private static final char union = '\u222A';
private static final char intersection = '\u2229';
private static final char product = '\u2A2F';
private static final char difference = '\u2216';


public static void main(String[] args) {
    MixedObjectsSet m = new MixedObjectsSet();
    m.operatorsQueue("(({1,2}" + difference + "{1,3})" +
            difference + "({1 } " + union + "{4})) " + union + "{1,3}");
}

public Queue operatorsQueue(String expr){

    Queue<Character> queue = new PriorityQueue<>();
    char[] exprCharArr = expr.toCharArray();

    for (int j = 0; j < exprCharArr.length; j++) {
        switch (exprCharArr[j]){
            case '(':
                queue.add('(');
                break;
            case ')':
                queue.add(')');
                break;
            case '\u222A':
                queue.add(union);
                break;
            case '\u2216':
                queue.add(difference);
                break;
            case '\u2A2F':
                queue.add(product);
                break;
            case '\u2229':
                queue.add(intersection);
                break;
            case ';':
                queue.add(';'); //for adding to storage instead of calculations
                break;
        }
    }


    System.out.println("queue.toString() = " + queue.toString());

    return queue;


   }
}

1 Ответ

1 голос
/ 31 января 2020

Массив queue в реализации PriorityQueue НЕ хранит элементы в том порядке, в котором они будут опрошены из очереди. PriorityQueue - это двоичная куча , и куча сохраняется в массиве queue, как описано здесь . Это означает, что вам не следует искать в массиве queue (если вы не знаете, как именно работает двоичная куча), потому что это инкапсулированная деталь реализации, которая делает то, что вы можете ожидать от его имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...