当前位置: 首页 > 知识库问答 >
问题:

队列在Java中未正确排序

轩辕奕
2023-03-14

我正在尝试写入优先级队列。对于我的排队方法,我的逻辑是:

如果列表为空,则将事务添加到链接列表中的第一个节点

如果列表不为空,请将列表中事务对象的时间值与当前对象进行比较,如果对象的时间大于链表中的对象,则将对象插入当前索引。

否则,只需将它们添加到linkedlist的最后一个元素

   public void enqueue(TransactionDetails elem){
        //check whether list is empty
        if (list.isEmpty()){
            list.addFirst(elem);
            return;
        }

        //queue it according to priority
        boolean positioned = false;
        for (int x = 0 ; x< list.size() ; x++){
            if ( elem.getTierTime() > list.get(x).getTierTime()){
                list.add(x , elem);
                positioned = true;
            }
        }

        if (positioned == false){
            list.addLast(elem);
        }

        
    }

   public String dequeue(){
    return list.removeFirst().getID();
   }

   public void printAll(){
    for (int x = 0 ; x< list.size() ; x++){
        System.out.println(list.get(x).toString());
    }
   }

我通过在方法中输入4个值来测试此方法,并相应地输入200020003000。

        System.out.println(queue.dequeue());
        System.out.println(queue.dequeue());
        System.out.println(queue.dequeue());
        System.out.println(queue.dequeue());

当我尝试从列表中除名时,它给我一个空输出

而不是

3000 2000 2000 2000 2000

此外,printAll方法也没有返回任何内容。

这是我的交易细节类。

public class TransactionDetails {

    private long epochTime;
    private String tier;
    private String transactionID;
    private int timeTier;

    public TransactionDetails(long time , String ID , String tier){
        this.epochTime = time;
        this.tier = tier;
        this.transactionID = ID;
        tierTimeAdvantage();
    }


    //To give the starting time of a transaction in a queue according to tier
    public void tierTimeAdvantage(){
        
        switch(this.tier){

            case "PLATINUM":
                timeTier = 3000;
                break;
            case "GOLD":
                timeTier = 2000;
                break;
            case "SILVER":
                timeTier = 1000;
                break;
            case "BRONZE" :
                timeTier = 0;
                break;
        }

    }
}

共有1个答案

费锋
2023-03-14

感谢评论部分的@Robert。

 for (int x = 0 ; x< list.size() ; x++){
                if ( elem.getTierTime() > list.get(x).getTierTime()){
                    list.add(x , elem);
                    positioned = true;
                    break;
                }
            }
    }

我应该在break语句中终止循环,一旦我得到了位置。

 类似资料:
  • 我的取消排队方法目前也不会删除我想要的项,而是从集合中删除最后一个元素。例如 如果我添加元素:1,2,3我的toString方法将按预期返回1,2,3。 然后,当我使用我的驱动程序调用 dequeue 时,它应该取消第 0 个元素的排队,在本例中为 1。 尽管该方法表示“已从队列中删除元素1”,提示<code>T result 然后,当我再次调用enqueue方法时,在同一个队列上,如果我将字符串

  • 我正在尝试自己编程气泡排序、选择排序和插入排序。但是,我在插入排序方面遇到了麻烦。我会提供我的代码以及每行在做什么 好的,所以int count是找出排序数组的起始位置。然后我声明了index以查找将元素放在排序数组之后的位置,并为未排序数组的第一个元素声明了一个临时int,如果它小于排序数组的最后一个元素。然后它反转数组直到第一个元素,如果它大于我要添加的元素,则为其索引分配索引。本质上是为了让

  • 我有一个Java,它被转换成,这样就可以用以下样式查看它: i、 e 现在的问题是,当我对日期列进行排序时,日期并没有按应有的顺序进行排序。 当前行为:预期行为: 我知道这是因为排序是基于字符串发生的。 我的问题是:有没有办法保留我想要显示日期的格式,并且仍然能够将它们作为日期排序?我可以把它们转换成字符串以外的任何形式吗? 请注意,我无法编辑排序机制。我唯一的选择是为专栏提供一个合适的日期格式。

  • 我正在编写一个最小优先级队列和一个最大优先级队列,如下所示: 输入数组的数字将一个接一个地添加到队列中。然而,当数组[12,4,5,3,8,7]是一个样本输入,打印优先队列的输出是: MIN:[3.0, 4.0, 5.0, 12.0, 8.0, 7.0]MAX:[12.0, 8.0, 7.0, 3.0, 4.0, 5.0] 我定义的比较器有什么问题吗?提前感谢你的帮助。

  • 我有一个,名为,其中包含类型的对象。 您可以在所有车辆上调用该方法。 我要做的是排序,这样车辆被赋予更高的优先级,并被放在队列的前面。 我假设我必须在这里使用一个比较器,但不知道怎么做。

  • 问题内容: 内的所有元素应并排且整齐并排,并受到200px高度的限制,并且没有奇怪的边距或填充。相反,您会遇到上述小提琴中出现的陌生感。 是什么原因造成,并得到中途按下页面,我怎么能解决这个问题?另外,我承认使用表可能是解决整个设置的更好方法,但是我想从上面的代码中找出问题,以便从这个错误中学习。 问题答案: 10.8线高的计算:“线高”和“垂直对齐”属性 “ inline-block”的基线是正