关于迭代器的问题
来源:7-3 相邻结点迭代器
小慕0436321
2019-05-12
bobo老师,在sparsegraph中vector g是私有变量, 为什么在 adjiterator中可以直接进行G.g[v].size ,并且在java中无法实现这操作, 只能把sparsegraph中g设为公有,老师, 有其他方法可以实现吗,将其设为私有, 还用调用这变量
写回答
1回答
-
liuyubobobo
2019-05-13
不同的语言,对访问限制的设计是不同的:)
其实,Java本身内置了迭代器,非常好用(其实C++也内置了,但由于使用起来语法复杂,所以课程没有采用)。直接使用课程官方提供的Java版本的代码就可以:)就是这样的:
// 返回图中一个顶点的所有邻边 public Iterable<Integer> adj(int v) { return g[v]; }
课程官方代码传送门,注意,每一小节都要配套的Java代码:
https://github.com/liuyubobobo/Play-with-Algorithms
具体使用也非常简单,可以参考下面的main函数,算作一个测试用例:)
import java.util.Vector; import java.util.Random; // 稀疏图 - 邻接表 public class SparseGraph { private int n; // 节点数 private int m; // 边数 private boolean directed; // 是否为有向图 private Vector<Integer>[] g; // 图的具体数据 // 构造函数 public SparseGraph( int n , boolean directed ){ assert n >= 0; this.n = n; this.m = 0; // 初始化没有任何边 this.directed = directed; // g初始化为n个空的vector, 表示每一个g[i]都为空, 即没有任和边 g = (Vector<Integer>[])new Vector[n]; for(int i = 0 ; i < n ; i ++) g[i] = new Vector<Integer>(); } public int V(){ return n;} // 返回节点个数 public int E(){ return m;} // 返回边的个数 // 向图中添加一个边 public void addEdge( int v, int w ){ assert v >= 0 && v < n ; assert w >= 0 && w < n ; g[v].add(w); if( v != w && !directed ) g[w].add(v); m ++; } // 验证图中是否有从v到w的边 boolean hasEdge( int v , int w ){ assert v >= 0 && v < n ; assert w >= 0 && w < n ; for( int i = 0 ; i < g[v].size() ; i ++ ) if( g[v].elementAt(i) == w ) return true; return false; } // 返回图中一个顶点的所有邻边 // 由于java使用引用机制,返回一个Vector不会带来额外开销, public Iterable<Integer> adj(int v) { assert v >= 0 && v < n; return g[v]; } public static void main(String[] args) { int N = 20; int M = 100; Random rand = new Random(); SparseGraph g = new SparseGraph(N , false); for( int i = 0 ; i < M ; i ++ ){ int a = rand.nextInt(N); int b = rand.nextInt(N); g.addEdge(a, b); } for(int v = 0 ; v < N ; v ++ ){ System.out.print(v + " : "); for(int w: g.adj(v)) // 使用adj这个迭代器 System.out.print(w + " "); System.out.println(); } } }
课程后续所有算法的Java版本,也都是基于这个迭代器版本实现的。相较而言,比C++方便不少呢:)
加油!:)
00
相似问题