记一下光缆路径计算的java代码。
开发前提:由于所做项目为电信项目中的光缆调度部分。每条光缆都会连接两个局站,若某条光缆出现问题需要将其精力临时切换其他光缆上来保证业务正常运行。这时就需要计算能够连接这条光缆的起始局站和终点局站的其他光缆有那些。图例如下:其中l4为出现问题的光缆,此时需要打到其他备用的光缆,其中包含了:路径一:L4本身,路径二:l5-l9,路径三:l1-l2-l6,路径4:l1-l3-l7-l6。下面附上java代码
![图1:示例路径](https://img-blog.csdnimg.cn/20210315092814315.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Zlbmd6aHVpemh1NTIw,size_16,color_FFFFFF,t_70)其中StrUtils是这个类名,Line和groupLine都是StrUtils的内部类。
private class Line{
private int a;//起点局站
private int z;//终点局站
private String n;//ID或名称
Line(int a,int z,String n){
this.a=a;
this.z=z;
this.n=n;
}
}
private class GroupLine{
List<Line> child;
GroupLine(List<Line> c){
this.child=c;
}
}
static List<Line> lst= new ArrayList<Line>();
private class doTest{
public void toDoGet() {
/**
* 构建一些线
*/
Line l1=new Line(2,1,"l1");
Line l2=new Line(1,3,"l2");
Line l3=new Line(1,7,"l3");
Line l4=new Line(2,4,"l4");
Line l5=new Line(2,5,"l5");
Line l6=new Line(3,4,"l6");
Line l7=new Line(3,7,"l7");
Line l8=new Line(3,6,"l8");
Line l9=new Line(5,4,"l9");
lst.add(l1);
lst.add(l2);
lst.add(l3);
lst.add(l4);
lst.add(l5);
lst.add(l6);
lst.add(l7);
lst.add(l8);
lst.add(l9);
/**
* 目的:获取目标线的a、z端的所有备用路径
* 例:l4断了,就得到起点或终点为2和4的线
*/
List<GroupLine> res=getTargetAZLine(l4.a, l4.z, lst, new ArrayList<Line>());
for(int t=0;t<res.size();t++) {
String out="";
for(Line l:res.get(t).child) {
out+=l.a+"--"+l.z+"--";
}
System.out.println("路径"+(t+1)+":"+out);
}
}
/**
*
* @param a 目标起点
* @param z 目标终点
* @param source 使用的源数据
* @param target 当前找到的合适的路径
* @return
*/
public List<GroupLine> getTargetAZLine(int a,int z,List<Line> source,List<Line> target){
List<GroupLine> res=new ArrayList<GroupLine>();
boolean con=false;
int comz=0;
for(Line t:source) {
for(Line e:target) {
if(e.n.contentEquals(t.n)) {
con=true;
break;
}
}
if(con) {
con=false;
continue;
}
if(t.z==a) {
comz=t.a;
con=true;
}else if(t.a==a) {
comz=t.z;
con=true;
}
if(con) {
List<Line> nt=new ArrayList<Line>();
nt.addAll(target);
nt.add(t);
if(comz==z ) {
res.add(new GroupLine(nt));
}else {
List<GroupLine> tre=getTargetAZLine(t.z, z, source, nt);
res.addAll(tre);
}
}
}
return res;
}
}
public static void main(String[] arg) {
StrUtils st=new StrUtils();
doTest t=st.new doTest();
t.toDoGet();
}