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

简介: 今天发现了新大陆。我以前一直以为,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;
  }
}
}


输出为:


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出去也可以。这样就可以保证优先队列的数据是最新的。


目录
相关文章
|
3月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
196 14
|
6月前
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
167 1
|
9月前
|
Java 程序员
Java 排序神器:Comparable 和 Comparator 该怎么选?
嗨,大家好,我是小米!今天和大家聊一聊Java社招面试中常考的经典问题——Comparable和Comparator的区别。Comparable定义对象的自然排序,适用于单一固定的排序规则;Comparator则是策略接口,用于定义自定义排序规则,适用于多样化或多变的排序需求。掌握这两者的区别是理解Java排序机制的基础,也是面试中的加分题。结合实际项目场景深入探讨它们的应用,能更好地打动面试官。如果你觉得有帮助,欢迎点赞、收藏、分享,期待你的一键三连!我们下期见~ 我是小米,一个喜欢分享技术的程序员,关注我的微信公众号“软件求生”,获取更多技术干货!
108 20
|
9月前
|
存储 监控 Java
JAVA线程池有哪些队列? 以及它们的适用场景案例
不同的线程池队列有着各自的特点和适用场景,在实际使用线程池时,需要根据具体的业务需求、系统资源状况以及对任务执行顺序、响应时间等方面的要求,合理选择相应的队列来构建线程池,以实现高效的任务处理。
354 12
|
9月前
|
运维 监控 算法
企业局域网监控软件中 Java 优先队列算法的核心优势
企业局域网监控软件是数字化时代企业网络安全与高效运营的基石,犹如一位洞察秋毫的卫士。通过Java实现的优先队列算法,它能依据事件优先级排序,确保关键网络事件如异常流量、数据泄露等被优先处理,保障系统稳定与安全。代码示例展示了如何定义网络事件类并使用PriorityQueue处理高优先级事件,尤其在面对疑似风险时迅速启动应急措施。这一核心技术助力企业在复杂网络环境中稳健前行,护航业务腾飞。
120 32
|
11月前
|
存储 缓存 安全
除了变量,final还能修饰哪些Java元素
在Java中,final关键字不仅可以修饰变量,还可以用于修饰类、方法和参数。修饰类时,该类不能被继承;修饰方法时,方法不能被重写;修饰参数时,参数在方法体内不能被修改。
137 3
|
11月前
|
Java
那些与Java Set擦肩而过的重复元素,都经历了什么?
在Java的世界里,Set如同一位浪漫而坚定的恋人,只对独一无二的元素情有独钟。重复元素虽屡遭拒绝,但通过反思和成长,最终变得独特,赢得了Set的认可。示例代码展示了这一过程,揭示了成长与独特性的浪漫故事。
71 4
|
11月前
|
存储 算法 Java
为什么Java Set如此“挑剔”,连重复元素都容不下?
在Java的集合框架中,Set是一个独特的接口,它严格要求元素不重复,适用于需要唯一性约束的场景。Set通过内部数据结构(如哈希表或红黑树)和算法(如哈希值和equals()方法)实现这一特性,自动过滤重复元素,简化处理逻辑。示例代码展示了Set如何自动忽略重复元素。
96 1
|
11月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
604 113
|
11月前
|
存储 Java 调度
Java 中的优先队列 PriorityQueue 详解
【10月更文挑战第22天】优先队列 PriorityQueue 是一种非常实用的数据结构,在许多场景中都能发挥重要作用。通过深入了解其特点和用法,我们可以更好地利用它来解决实际问题。
484 13