算法:用Java实现图论算法中的拓扑排序,并应用拓扑排序安排课程表

本文我打算用Java实现图论算法中的拓扑排序,并应用拓扑排序安排课程表。课程表就是很常规的那种Java学习的简单路线图,首先下图就是Java课程学习的一个拓扑顺序图:
在这里插入图片描述
上面这张图是什么意思呢?黑色的字就代表要学习的课程,而红色的箭头就代表课程学习的拓扑顺序,课程之间是有依赖的,箭头代表课程学习顺序:

  1. 最左边的Java、SQL、HTML、CSS这类课程则不需要提前学习任何课程,即可开始学习
  2. 想学习Servlet课程,你就需要先学习Java课程,然后才能学习Servlet课程
  3. 想学习JSP课程,你就得先学习Java课程和JavaScript课程,而学习JavaScript课程,就得先学习HTML和CSS课程

从上面的解读例子中,你应该明白了,课程学习是有依赖关系的,不是你想按照什么顺序来学都可以的。你只学了Servlet和JSP,没学过SQL,是无法学习SSM的(大家都懂的)。从上面的课程拓扑顺序可以看出,部分课程的学习都是在其他的课程学习完毕后,才能开始学习的,其依赖关系如下:

  • Java:先决条件:无
  • HTML:先决条件:无
  • CSS:先决条件:无
  • SQL:先决条件:无
  • JavaScript:先决条件:HTML、CSS
  • Servlet:先决条件:Java
  • JSP:先决条件:Java、JavaScript
  • SSM:先决条件:JSP、Servlet、SQL
  • SpringBoot:先决条件:SSM

其实上面的课程拓扑顺序,也可以看做是一个有向无环图,也就是传说中的DAG图。如何按照上面的学习依赖顺序,安排所有课程的学习顺序呢?这里就用图论算法中的拓扑排序算法。

首先,我们构建上面的课程拓扑顺序图的邻接矩阵:
在这里插入图片描述
从上面的邻接矩阵图中可以看出,竖着的列,是1的就指着自己。比如SSM,竖着下来有3个1,横过去看,就是SQL、Servlet和JSP指着它。所以说,我们可以通过竖着数1的个数,来判断有多少课程指着自己,在图论中,就叫一个顶点的入度。在有向图中,如果有N条边的箭头指向某个顶点,就说这个顶点的入度是N。当然某一列的所有数字都是0,则代表这个顶点的入度是0,没有任何其他顶点指着它。

拓扑排序的思路如下:

  1. 先找到入度为0的顶点(排序List中不能存在),就是顶点的那一列全是0,如果有多个,就取其一,放入排序List中
  2. 放入后,在邻接矩阵中删除该顶点及其出去的边,也就是将顶点的那一行全部弄成0
  3. 再继续找入度为0的顶点,重复3,然后再接着重复4,直到排序List中的排序元素个数与顶点个数相等,或者说找不到入度为0且排序List中不存在的顶点了,完成拓扑排序

接下来就是我用Java实现的拓扑排序,实现上面课程的顺序安排方案(所有可行的方案),算法的代码和精髓都在下面的代码和其间详尽的注释中:

import java.util.ArrayList;
import java.util.List;

/**
 * @author LiYang
 * @ClassName TopologicalSort
 * @Description 图论算法中的拓扑排序
 * @date 2019/11/18 18:33
 */
public class TopologicalSort {

    /**
     * 返回示例图的邻接矩阵
     * @return 示例图邻接矩阵
     */
    public static int[][] initCourseMatrix() {
        //创建示例图邻接矩阵
        return new int[][]{
                {0, 0, 0, 0, 0, 1, 1, 0, 0},
                {0, 0, 0, 0, 1, 0, 0, 0, 0},
                {0, 0, 0, 0, 1, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 1, 0},
                {0, 0, 0, 0, 0, 0, 1, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 1, 0},
                {0, 0, 0, 0, 0, 0, 0, 1, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 1},
                {0, 0, 0, 0, 0, 0, 0, 0, 0}
        };
    }

    /**
     * 拷贝matrix矩阵
     * @param matrix 源邻接矩阵
     * @return 拷贝的邻接矩阵
     */
    public static int[][] copyMatrix(int[][] matrix) {
        //新的邻接矩阵,和原来的一样大,正方形
        int[][] newMatrix = new int[matrix.length][matrix.length];
        
        //双重遍历拷贝
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix.length; j++) {
                newMatrix[i][j] = matrix[i][j];
            }
        }
        
        //返回拷贝的副本邻接矩阵
        return newMatrix;
    }

    /**
     * 拷贝List
     * @param order 源orderList
     * @return 拷贝的副本orderList
     */
    public static List<Integer> copyList(List<Integer> order) {
        //拷贝的List
        List<Integer> copyList = new ArrayList<>();
        
        //拷贝
        for (Integer item : order) {
            copyList.add(item);
        }
        
        //返回拷贝的副本
        return copyList;
    }

    /**
     * 打印课程顺序表
     * @param order 课程排序表
     * @param courseName 课程名字
     */
    public static void printCourseOrderTable(List<Integer> order, String[] courseName) {
        //课程表名字List
        List<String> courseTable = new ArrayList<>();
        
        //依据排好序的orderList,提取并加入课程名
        for (Integer item : order) {
            courseTable.add(courseName[item]);
        }
        
        //组装课程顺序表字符串
        String courseList = courseTable.toString().replaceAll("\\[", "")
                .replaceAll("]", "").replaceAll(", ", " -> ");
        
        //打印课程顺序表
        System.out.println(courseList);
    }

    /**
     * 拓扑排序(安排示例课程图的课程表)
     * @param matrix 课程拓扑顺序的邻接矩阵
     * @param order 课程顺序List
     * @param courseName 课程名称字符串数组
     */
    public static void topologicalSort(int[][] matrix, List<Integer> order, String[] courseName) {
        //如果所有课程已经排完序了
        if (order.size() == matrix.length) {
            
            //打印排好序的课程顺序表
            printCourseOrderTable(order, courseName);
            
            //结束递归
            return;
        }

        //遍历找入度为0的课程
        for (int i = 0; i < matrix.length; i++) {
            //如果当前课程已经在拓扑排序列表里面了 
            if (order.contains(i)) {
                //略过,不作处理
                continue;
            }
            
             //判断课程是否全是0,也就是入度为0
            boolean allZero = true;
            
            //遍历查看是否是入度为0
            for (int j = 0; j < matrix.length; j++) {
                if (matrix[j][i] > 0) {
                    allZero = false;
                    break;
                }
            }
            
            //如果课程入度为0,则可以用于拓扑排序的下一门课程
            if (allZero) {
                
                //复制当前排序表
                List<Integer> newOrder = copyList(order);
                
                //加入当前课程
                newOrder.add(i);
                
                //复制当前的邻接矩阵
                int[][] newMatrix = copyMatrix(matrix);

                //将当前已加入的课程删除,同时删除顶点和边
                for (int k = 0; k < matrix.length; k++) {
                    newMatrix[i][k] = 0;
                }
                
                //继续往下,递归进行拓扑排序
                topologicalSort(newMatrix, newOrder, courseName);
            }
        }
    }

    /**
     * 拓扑排序的驱动程序
     * @param matrix 课程拓扑顺序的邻接矩阵
     * @param courseName 课程名字
     */
    public static void topologicalSort(int[][] matrix, String[] courseName) {
        //新建一个课程排序表
        List<Integer> order = new ArrayList<>();
        
        //启动课程表的拓扑排序
        topologicalSort(matrix, order, courseName);
    }

    /**
     * 运行拓扑排序算法,求出示例图中的所有课程安排方案
     * @param args
     */
    public static void main(String[] args) {
        //获得示例图的邻接矩阵
        int[][] matrix = initCourseMatrix();
        
        //课程名称的字符串数组
        String[] courseName = new String[]{"Java", "HTML", "CSS", "SQL", "JavaScript", "Servlet", "JSP", "SSM", "SpringBoot"};
        
        //运行拓扑排序,求出示例图中的所有课程安排方案
        topologicalSort(matrix, courseName);
    }
    
}

运行TopologicalSort类的main方法,执行课程的拓扑排序算法,控制台打印了所有的可行的课程安排方案,测试通过:

Java -> HTML -> CSS -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> HTML -> CSS -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
Java -> HTML -> CSS -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> HTML -> SQL -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> HTML -> SQL -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> HTML -> SQL -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> SQL -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> Servlet -> CSS -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> Servlet -> CSS -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> HTML -> Servlet -> CSS -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> HTML -> Servlet -> SQL -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> CSS -> HTML -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
Java -> CSS -> HTML -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> CSS -> SQL -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> CSS -> SQL -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> CSS -> SQL -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> SQL -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> Servlet -> HTML -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> Servlet -> HTML -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> CSS -> Servlet -> HTML -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> CSS -> Servlet -> SQL -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> HTML -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> SQL -> HTML -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> SQL -> HTML -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> HTML -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> CSS -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> SQL -> CSS -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> SQL -> CSS -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> CSS -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> Servlet -> HTML -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> Servlet -> CSS -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> HTML -> CSS -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> HTML -> CSS -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> Servlet -> HTML -> CSS -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> Servlet -> HTML -> SQL -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> CSS -> HTML -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> CSS -> HTML -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> Servlet -> CSS -> HTML -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> Servlet -> CSS -> SQL -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> SQL -> HTML -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> SQL -> CSS -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> Java -> CSS -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
HTML -> Java -> CSS -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
HTML -> Java -> SQL -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> Java -> SQL -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> Java -> SQL -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> SQL -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> Servlet -> CSS -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> Servlet -> CSS -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
HTML -> Java -> Servlet -> CSS -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
HTML -> Java -> Servlet -> SQL -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> Java -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
HTML -> CSS -> Java -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
HTML -> CSS -> SQL -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> SQL -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> SQL -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> CSS -> SQL -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> SQL -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> SQL -> Java -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> SQL -> Java -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> SQL -> Java -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> SQL -> Java -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> SQL -> Java -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> SQL -> Java -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> SQL -> CSS -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> SQL -> CSS -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> SQL -> CSS -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> SQL -> CSS -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> SQL -> CSS -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> Java -> HTML -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> Java -> HTML -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
CSS -> Java -> HTML -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
CSS -> Java -> SQL -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> Java -> SQL -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> Java -> SQL -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> SQL -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> Servlet -> HTML -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> Servlet -> HTML -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
CSS -> Java -> Servlet -> HTML -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
CSS -> Java -> Servlet -> SQL -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> Java -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
CSS -> HTML -> Java -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
CSS -> HTML -> SQL -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> SQL -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> SQL -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> HTML -> SQL -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> SQL -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> SQL -> Java -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> SQL -> Java -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> SQL -> Java -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> SQL -> Java -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> SQL -> Java -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> SQL -> Java -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> SQL -> HTML -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> SQL -> HTML -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> SQL -> HTML -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> SQL -> HTML -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> SQL -> HTML -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> Java -> HTML -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> Java -> HTML -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> Java -> HTML -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> HTML -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> CSS -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> Java -> CSS -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> Java -> CSS -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> CSS -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> Servlet -> HTML -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> Servlet -> CSS -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> HTML -> Java -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> HTML -> Java -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> HTML -> Java -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> HTML -> Java -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> HTML -> CSS -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> HTML -> CSS -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> HTML -> CSS -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> HTML -> CSS -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> HTML -> CSS -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> CSS -> Java -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> CSS -> Java -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> CSS -> Java -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> CSS -> Java -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> CSS -> HTML -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> CSS -> HTML -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> CSS -> HTML -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> CSS -> HTML -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> CSS -> HTML -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章