- 今天发现了新大陆。我以前一直以为,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出去也可以。这样就可以保证优先队列的数据是最新的。