当前位置:首页 > Java

java如何优先遍历

2026-03-24 03:30:41Java

优先遍历的实现方法

在Java中实现优先遍历(通常指优先队列或带权图的遍历)可以通过多种方式完成。以下是常见的实现方法:

使用PriorityQueue实现优先遍历

PriorityQueue是Java集合框架中的一个类,基于优先级堆实现。默认情况下,元素按自然顺序排序,也可以通过Comparator自定义排序规则。

java如何优先遍历

import java.util.PriorityQueue;

public class PriorityTraversal {
    public static void main(String[] args) {
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        pq.add(5);
        pq.add(1);
        pq.add(3);

        while (!pq.isEmpty()) {
            System.out.println(pq.poll());
        }
    }
}

自定义Comparator实现特定优先级

当需要按照非自然顺序排序时,可以传递Comparator给PriorityQueue。

java如何优先遍历

import java.util.Comparator;
import java.util.PriorityQueue;

public class CustomPriority {
    public static void main(String[] args) {
        PriorityQueue<Integer> pq = new PriorityQueue<>(Comparator.reverseOrder());
        pq.add(5);
        pq.add(1);
        pq.add(3);

        while (!pq.isEmpty()) {
            System.out.println(pq.poll());
        }
    }
}

图的优先遍历(如Dijkstra算法)

对于带权图的优先遍历,通常使用优先队列来选择当前最短路径节点。

import java.util.*;

class Node implements Comparable<Node> {
    int vertex;
    int distance;

    public Node(int vertex, int distance) {
        this.vertex = vertex;
        this.distance = distance;
    }

    @Override
    public int compareTo(Node other) {
        return Integer.compare(this.distance, other.distance);
    }
}

public class Dijkstra {
    public void shortestPath(List<List<Node>> adj, int src) {
        PriorityQueue<Node> pq = new PriorityQueue<>();
        int[] dist = new int[adj.size()];
        Arrays.fill(dist, Integer.MAX_VALUE);

        pq.add(new Node(src, 0));
        dist[src] = 0;

        while (!pq.isEmpty()) {
            Node current = pq.poll();

            for (Node neighbor : adj.get(current.vertex)) {
                if (dist[neighbor.vertex] > dist[current.vertex] + neighbor.distance) {
                    dist[neighbor.vertex] = dist[current.vertex] + neighbor.distance;
                    pq.add(new Node(neighbor.vertex, dist[neighbor.vertex]));
                }
            }
        }
    }
}

使用TreeSet实现优先遍历

TreeSet是基于TreeMap实现的NavigableSet,可以保持元素有序。

import java.util.TreeSet;

public class TreeSetExample {
    public static void main(String[] args) {
        TreeSet<Integer> ts = new TreeSet<>();
        ts.add(5);
        ts.add(1);
        ts.add(3);

        for (Integer num : ts) {
            System.out.println(num);
        }
    }
}

注意事项

  • PriorityQueue不允许null元素
  • PriorityQueue的迭代顺序不保证有序,只有通过poll/remove方法获取的元素才是有序的
  • 对于自定义对象,需要实现Comparable接口或提供Comparator
  • PriorityQueue的时间复杂度:插入和删除操作都是O(log n)

标签: 遍历java
分享给朋友:

相关文章

java如何运行

java如何运行

运行Java程序的基本方法 Java程序的运行需要经过编写、编译和执行三个主要阶段。以下是具体步骤: 编写Java源代码 创建一个以.java为后缀的文件,例如HelloWorld.java。文件内…

java如何编程

java如何编程

Java编程基础 Java是一种面向对象的编程语言,广泛应用于企业级开发、移动应用(Android)等领域。以下是Java编程的核心步骤和示例。 环境搭建 安装JDK 从Oracle官网下载适合…

java如何创建对象

java如何创建对象

创建对象的基本方法 在Java中,创建对象主要通过new关键字调用构造函数完成。基本语法为: ClassName objectName = new ClassName(); 例如创建String对象…

java如何输入字符串

java如何输入字符串

使用 Scanner 类 在 Java 中,可以通过 java.util.Scanner 类来输入字符串。以下是一个示例代码: import java.util.Scanner; public c…

java如何创建数组

java如何创建数组

创建数组的基本方法 在Java中,数组是固定大小的同类型元素集合。创建数组需要声明数组类型并初始化。 声明数组 语法格式为 数据类型[] 数组名 或 数据类型 数组名[]: int[] arr1;…

java如何生成随机数

java如何生成随机数

生成随机数的方法 在Java中生成随机数可以通过多种方式实现,以下是几种常见的方法: 使用Math.random()方法 Math.random()方法返回一个double类型的伪随机数,范围在[0…