java优先队列PriorityQueue修改队列内元素排序问题

Wesley13
• 阅读 843
  • 今天发现了新大陆。我以前一直以为,PriorityQueue队列是基于堆排序的不断更新排序的,没错,它是不断更新排序的。但是前提是要插入(删除)数据,如果仅仅是修改已经稳定队列的值或内容,而不进行插入或者删除,那么,这个顺序是不会变的。
    举个例子:

    import java.util.Comparator; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner;

    public class BankerClass {

    public static void main(String[] args) {

     Queueq1=new PriorityQueue(com);
     q1.add(new node(1, 5));
     node team=new node(2, 2);
     q1.add(team);
     q1.add(new node(3, 9));
     q1.add(new node(4, 7));
     for(node no:q1)
     {
    
    
    
         System.out.println("id :" no.id " value" no.value);
     }
     System.out.println();
     team.value=6;//修改了value,按道理不应该在第一,
     for(node no:q1)
     {
    
    
    
         System.out.println("id :" no.id " value" no.value);
     }
     
    

    } static Comparatorcom=new Comparator() {

        @Override
        public int compare(node o1, node o2) {
    

    //基于value排序 return o1.value-o2.value; } }; static class node {

    int id;
    int value;
    public node(int id,int value)
    {
    
    
    
        this.value=value;
        this.id=id;
    }
    

    } }

输出为:
id :2 value2
id :1 value5
id :3 value9
id :4 value7

id :2 value6
id :1 value5
id :3 value9
id :4 value7
如果想更新排序,可以这样操作:修改后添加
q1.remove(team);
q1.add(team);

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;

public class BankerClass {
   
   
   

 public static void main(String[] args)
 {
   
   
   
     Queueq1=new PriorityQueue(com);
     q1.add(new node(1, 5));
     node team=new node(2, 2);
     q1.add(team);
     q1.add(new node(3, 9));
     q1.add(new node(4, 7));
     for(node no:q1)
     {
   
   
   
         System.out.println("id :" no.id " value" no.value);
     }
     System.out.println();
     team.value=6;//修改了value,按道理不应该在第一,
     q1.remove(team);
     q1.add(team);
     for(node no:q1)
     {
   
   
   
         System.out.println("id :" no.id " value" no.value);
     }
     
 }
 static Comparatorcom=new Comparator() {
   
   
   

        @Override
        public int compare(node o1, node o2) {
   
   
   //基于value排序
            return o1.value-o2.value;
        }
    };
static class node
{
   
   
   
    int id;
    int value;
    public node(int id,int value)
    {
   
   
   
        this.value=value;
        this.id=id;
    }
}
}

输出为:
id :2 value2
id :1 value5
id :3 value9
id :4 value7

id :1 value5
id :2 value6
id :3 value9
id :4 value7

当然有多个如果你也可以添加一个新的node肯定排在第一的,然后poll出去也可以。这样就可以保证优先队列的数据是最新的。

如果对后端、爬虫、数据结构算法等感性趣欢迎关注我的个人公众号交流:bigsai
java优先队列PriorityQueue修改队列内元素排序问题

本文分享 CSDN - Big sai。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java Collection
总结1.优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C的优先队列每次取最大元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(_naturalordering_),也可以通过构造时传入的比较器(_Comparator_,类似于C的仿函数)。2.Java中Prio
Stella981 Stella981
2年前
LinkedBlockingQueue 介绍
LinkedBlockingQueue是一个基于已链接节点的、范围任意的blockingqueue。此队列按FIFO(先进先出)排序元素。队列的头部是在队列中时间最长的元素。队列的尾部是在队列中时间最短的元素。新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可
Stella981 Stella981
2年前
BlockingQueue介绍
几种类型的BlockingQueueArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。DelayQueue:一个使用优先级队列实现的无界阻塞队列。Synchro
Stella981 Stella981
2年前
PriorityBlockingQueue 介绍
PriorityBlockingQueue是一个基于优先级堆的无界的并发安全的优先级队列(FIFO),队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的Comparator进行排序,具体取决于所使用的构造方法。实现原理PriorityBlockingQueue通过使用堆这种数据结构实现将队列中的元素按照某种排序规则进行排序,从而改变先进先
Stella981 Stella981
2年前
JOptionPane修改图标
1.在Linux平台下.JOptionPane会显示Java默认的图标,在window平台不显示图标,如何替换这个图标了?2JOptionPane.setIcon(Icon)修改的是内容区域的icon,而不是左上角的Icon.所以需要通过修改Jdialog/Frame的图标来达到修改默认图标的问题.3.代码:if(JOptio
Wesley13 Wesley13
2年前
JAVA线程15
一、阻塞队列1\.概述阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue。阻塞队列是一个指定长度的队列,如果队列满了,添加新元素的操作会被阻塞等待,直到有空位为止。同样,当队列为空时候,请求队列元素的操作同样会阻塞等待,直到有可用元
Wesley13 Wesley13
2年前
Java并发 阻塞队列
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加操作支持阻塞地插入和移除方法。支持阻塞插入的方法是指当队列满时会阻塞插入元素的线程,直到队列不满;支持阻塞移除的方法是指当队列为空时获取元素的线程无法继续获取元素直到队列不空。可以发现阻塞队列非常适合消费者和生产者场景下进行使用,生产者生产数据就是向阻塞队列中插入元素,消费者消
Wesley13 Wesley13
2年前
PHP优先级队列
优先级队列首先,我们要了解一下什么叫队列:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。从定义来看,队列是无法更改顺序的线性集合。线性集合一般有几种规则:先进先出(队