【问题标题】:Queue unexpectedly puts last element in the front when I call poll()当我调用 poll() 时,队列意外地将最后一个元素放在前面
【发布时间】:2015-12-09 02:23:25
【问题描述】:

我有以下代码。我正在尝试对我创建的名为 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!");
    }

}


}

这是我的 HabitItems 类

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;
    }
}

}

【问题讨论】:

  • 什么是queueHabitItems
  • queueHabitItems 是一个优先队列
  • 您调用poll() 检索队列的头部,但您没有将返回的值分配给任何东西。这样做有什么好处?
  • 具体实现是什么?就像那个实际的 Java 名称和包一样。基本上,您需要发布更多代码。
  • 现在你的问题是关于poll(),但是你已经从你发布的代码中删除了所有的投票电话。是什么赋予了?而且您仍然没有检索到remove() 调用返回的对象,这可能是您可以做的最重要的事情。投票结束问题是一个非常令人困惑的问题。

标签: java queue back peek


【解决方案1】:

同样,不要使用 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 调用只是查看集合,但不尊重优先级。 poll 和 remove 尊重这一点。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多