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

举报
bigsai 发表于 2021/02/02 23:38:31 2021/02/02
【摘要】 今天发现了新大陆。我以前一直以为,PriorityQueue队列是基于堆排序的不断更新排序的,没错,它是不断更新排序的。但是前提是要插入(删除)数据,如果仅仅是修改已经稳定队列的值或内容,而不进行插入或者删除,那么,这个顺序是不会变的。 举个例子: import java.util.Comparator; import java.util.PriorityQueue;...
  • 今天发现了新大陆。我以前一直以为,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;
	}
}
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

输出为:
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;
	}
}
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

输出为:
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

文章来源: bigsai.blog.csdn.net,作者:Big sai,版权归原作者所有,如需转载,请联系作者。

原文链接:bigsai.blog.csdn.net/article/details/84646398

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。