当前位置:首页 > 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
分享给朋友:

相关文章

react如何遍历

react如何遍历

遍历数组或对象的方法 在React中,遍历数组或对象通常用于渲染列表或动态生成内容。以下是几种常见的遍历方法: 使用map遍历数组map是遍历数组并返回新数组的高阶函数,适合渲染列表。…

java如何输入数组

java如何输入数组

输入数组的方法 在Java中,可以通过多种方式输入数组,具体取决于输入源(如控制台、文件等)和数组类型(如基本类型或对象类型)。以下是几种常见的方法: 使用Scanner从控制台输入 对于基本数据类…

如何运行java项目

如何运行java项目

运行Java项目的步骤 确保Java环境已安装 在运行Java项目前,需确认系统已安装Java Development Kit(JDK)。通过命令行输入java -version和javac -ver…

java如何实现多继承

java如何实现多继承

在Java中,由于语言设计本身不支持多继承(即一个类不能直接继承多个父类),但可以通过以下方式间接实现类似多继承的效果: 使用接口实现多继承 接口允许一个类实现多个接口,从而继承多个抽象行为。接口中…

php 实现 java md5加密

php 实现 java md5加密

PHP 实现 Java MD5 加密 Java 和 PHP 的 MD5 加密结果可能存在差异,主要由于字符编码和输出格式的不同。以下是确保 PHP 与 Java MD5 加密结果一致的方法。 确保字…

Vue实现遍历并交互

Vue实现遍历并交互

Vue实现遍历并交互 在Vue中,可以使用v-for指令遍历数组或对象,并结合事件绑定实现交互功能。以下是一个完整的实现方法: 遍历数组并绑定点击事件 <template> &l…