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


目录
相关文章
|
1月前
|
存储 缓存 安全
除了变量,final还能修饰哪些Java元素
在Java中,final关键字不仅可以修饰变量,还可以用于修饰类、方法和参数。修饰类时,该类不能被继承;修饰方法时,方法不能被重写;修饰参数时,参数在方法体内不能被修改。
28 2
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
48 3
|
2月前
|
Java
在Java的世界里,Set只接纳独一无二的元素。
【10月更文挑战第16天】在Java的世界里,Set只接纳独一无二的元素。本文通过拟人化的手法,讲述了重复元素从初次尝试加入Set被拒绝,到经历挣扎、反思,最终通过改变自己,成为独特个体并被Set接纳的全过程。示例代码展示了这一过程的技术实现。
26 1
|
1月前
|
Java
那些与Java Set擦肩而过的重复元素,都经历了什么?
在Java的世界里,Set如同一位浪漫而坚定的恋人,只对独一无二的元素情有独钟。重复元素虽屡遭拒绝,但通过反思和成长,最终变得独特,赢得了Set的认可。示例代码展示了这一过程,揭示了成长与独特性的浪漫故事。
21 4
|
1月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
1月前
|
存储 Java 调度
Java 中的优先队列 PriorityQueue 详解
【10月更文挑战第22天】优先队列 PriorityQueue 是一种非常实用的数据结构,在许多场景中都能发挥重要作用。通过深入了解其特点和用法,我们可以更好地利用它来解决实际问题。
110 13
|
1月前
|
存储 算法 Java
为什么Java Set如此“挑剔”,连重复元素都容不下?
在Java的集合框架中,Set是一个独特的接口,它严格要求元素不重复,适用于需要唯一性约束的场景。Set通过内部数据结构(如哈希表或红黑树)和算法(如哈希值和equals()方法)实现这一特性,自动过滤重复元素,简化处理逻辑。示例代码展示了Set如何自动忽略重复元素。
30 1
|
2月前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
45 4
|
2月前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。它通过 hashCode() 和 equals() 方法确保元素唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 实现这一特性。
34 5
|
2月前
|
Java 开发者
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
30 2