当我调用 poll() 时,队列意外地将最后一个元素放在前面

Queue unexpectedly puts last element in the front when I call poll()

我有以下代码。我正在尝试对我创建的名为 HabitItem 的树进行广度优先搜索。

这里是队列遍历

import java.io.File;
import java.util.*;
import java.util.concurrent.PriorityBlockingQueue;
public static void traverseQueue() {
    queueHabitItems.add(head);
    while(!queueHabitItems.isEmpty()){
        HabitItem node = queueHabitItems.peek();
        for(int i = 0; i < node.children.size(); i++)
        {
            HabitItem it = node.children.get(i);
            System.out.print("node: ");
            System.out.print(node.name);
            System.out.print(", child: ");
            System.out.println(it.name);
            queueHabitItems.offer(it);
        }
        queueHabitItems.poll();
        System.out.println("Something Good Is Coming");
    }
}

我正在尝试实现一个队列。我正在使用 Poll() 函数来删除元素。假设我在队列中有以下数据。

A B C D E

而且我想用poll()来移除前面的元素。好吧,出于某种原因,E 排到了列表的前面,这样它就变成了

E B C D

我是不是做错了什么,或者我对队列有什么根本不了解的地方? B不应该是最前面的吗?

public class myMain {

static PriorityQueue<HabitItem> queueHabitItems = new    PriorityQueue<HabitItem>();

static HabitItem head = new HabitItem("A");
static HabitItem B = new HabitItem("B");
static HabitItem C = new HabitItem("C");
static HabitItem D = new HabitItem("D");
static HabitItem E = new HabitItem("E");
static HabitItem F = new HabitItem("F");
static HabitItem G = new HabitItem("G");
static HabitItem H = new HabitItem("H");
static HabitItem I = new HabitItem("I");
static HabitItem J = new HabitItem("J");
static HabitItem K = new HabitItem("K");
static HabitItem L = new HabitItem("L");
static HabitItem M = new HabitItem("M");
static HabitItem N = new HabitItem("N");
static HabitItem O = new HabitItem("O");

public static void hardCodeHabits() {
    System.out.print(D.id);


    head.children.add(B);
    head.children.add(C);
    head.children.add(D);
    head.children.add(E);
    B.children.add(F);
    B.children.add(G);
    B.children.add(H);
    C.children.add(I);
    B.children.add(J);
    E.children.add(K);
    I.children.add(L);
    L.children.add(N);
    L.children.add(M);
    N.children.add(O);
    System.out.print(D.id);

}

public static void traverseQueue() {
    queueHabitItems.add(head);
    while(!queueHabitItems.isEmpty()){
        HabitItem node = queueHabitItems.peek();
        for(int i = 0; i < node.children.size(); i++)
        {
            HabitItem it = node.children.get(i);
            System.out.print("node: ");
            System.out.print(node.name);
            System.out.print(", child: ");
            System.out.println(it.name);
            queueHabitItems.offer(it);
        }
        queueHabitItems.remove();
        System.out.println("Something Good Is Coming");
    }
}

public static void main(String[] args) {
    System.out.println("Hello world");
    hardCodeHabits();
    traverseQueue();
    try{
        Scanner x = new Scanner(new File("justText.txt"));
        Formatter y = new Formatter(new File("output.txt"));

        y.format("%s", "hey");
        y.close();

        while (x.hasNext()) {
            System.out.println(x.next());
        }
    }
    catch(Exception e) {
        System.out.println("Couldn't open the file!");
    }

}


}

这是我的习惯项class

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class HabitItem implements Comparable<HabitItem> {
static int Counter = 0;
String name;
boolean completed[] = new boolean[7];
List<HabitItem> children = new ArrayList<HabitItem>();
int id;


public String getName(){
    return name;
}
public boolean[] getCompleted(){
    return completed;
}
public void setCompleted(int index, boolean checked){
    completed[index] = checked;
}

public boolean isChecked(int index){
    return completed[index];
}

public HabitItem(String name) {
    super();
    Counter++;
    this.id = Counter;
    this.name = name;
    for(int i = 0; i < 7; i++){
        completed[i] = false;
    }
}

public HabitItem(int id) {
    super();
    Counter++;
    this.id = id;
}

public int compareTo(HabitItem o) {
    if(o.id == this.id)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

}

同样,不要使用 peek,使用 remove:

    while (!queueHabitItems.isEmpty()) {
        //!! HabitItem node = queueHabitItems.peek();
        HabitItem node = queueHabitItems.remove();
        for (int i = 0; i < node.children.size(); i++) {
            HabitItem it = node.children.get(i);
            System.out.print("node: ");
            System.out.print(node.name);
            System.out.print(", child: ");
            System.out.println(it.name);
            queueHabitItems.offer(it);
        }
        // !! queueHabitItems.remove();
        System.out.println("Something Good Is Coming");
    }

peek 调用只是查看集合,但不考虑优先级。 pollremove 确实尊重这一点。

这已经很老了,可能不再重要了。但我只想说,事实证明我很困惑,因为我认为 priorityQueue 与队列完全相同。