Przeglądaj źródła

modify SortingService logic.

171870002 5 lat temu
rodzic
commit
e24c5dbe55

+ 81 - 5
data-structure接口返回值说明文档.md

@@ -4316,13 +4316,89 @@ allSorted: 所有值都排好序了,所有的值都为蓝色
 
 后端返回值:
 
+/**
+
+后端返回值的含义解析:
+
+后端返回的json都是一个Response对象,去掉外层的response之后,返回的是{graph:     ,content:     }。
+
+graph属性:表示现在已被渲染的图(也是原来后端传给前端的图,没有变,不需要重新渲染图,无意义,前端可以忽略这个属性。
+
+content属性:表示图动态变化的内容,是一个数组。它将图的动态变化划分为一个一个的步骤,每一个步骤被描述为一个对象:
+
+{
+
+​        "type": "tryRoad",    //步骤的类型,有"tryRoad"和"visit"两种。tryRoad意为“探路”,是一种尝试访问某个节点的行为。尝试访问某个节点不一定成功,可能某个节点已被访问过了,那么就不能重复访问。也可能是虽没被访问过,但是已有路径被标记为可以到达它,因此不需要再标记一个可行路径。所以探路可能会失败。若某节点经探路发现,还没有被访问或还没有被标记可行路径,那么探路成功。下个步骤就会visit这个节点。visit意为访问某个节点。当某一个节点还没被访问的时候,可以visit这个节点。节点通常先被探路,探路成功后,下面再被访问。
+
+​        "end": 2,      //无论是探路还是访问,“路径”都是指节点与节点之间的某个连线。end是探路或访问路径的结束节点。
+
+​        "success": **true**,   //探路是否成功
+
+​        "start": 0    //探路或访问路径的开始节点。当type为visit的时候start没有意义,end代表访问的节点。
+
+​      }
+
+例如,上面的步骤对象代表了图的一个动态变化动作:沿路径0-2(从0开始,终点是2),从节点0对节点2进行试探,探路成功。
+
+渲染效果:
+
+1. {                  
+
+​        "type": "visit",   
+
+​        "end": 0,
+
+​        "success": **true**,
+
+​        "start": 0
+
+​      },
+
+//访问节点0(以end的值为准,此时start无意义),渲染为将节点0的轮廓(即一个圆圈)加粗(要很明显),证明它正在被访问。直到下一个节点被visit之前,这个节点的轮廓一直是被加粗的。
+
+
+
+​     2. {
+
+​        "type": "tryRoad",
+
+​        "end": 2,
+
+​        "success": **true**,
+
+​        "start": 0
+
+​      },
+
+//探路0-2,从0出发试探2有没有被访问过或有没有被标记过有可行路径到达,渲染为将0-2之间的连线的箭头改为从0指向2的红色带单箭头的连线(红色连线表明正在探这条路)(原图可能是灰色的双箭头连线)若,success=true说明2没有被访问过,则再次渲染为将这个连线的双箭头恢复,连线变为蓝色(蓝色连线表明路径可行。)。若success=false,则再次渲染为将这个连线的双箭头恢复,连线变为原来的灰色。(灰色代表路径不可行)(探路行为需要两次渲染,访问行为需要一次渲染。)
+
+​     3. {
+
+​        "type": "visit",
+
+​        "end": 2,
+
+​        "success": **true**,
+
+​        "start": 0
+
+​      },
+
+//访问节点2,同理,将节点2的轮廓加粗设为黑色。(直到下一个节点被访问了,那么取消这个节点的轮廓加粗效果。)
+
+   
+
+/*
+
+
+
 {
 
   "content": {
 
-​    "graph": {
+​    "graph": {         //原来前端传给后端的图,没有变,不需要把图再渲染一遍。即,这个返回给前端的graph属性
 
-​      "nodeNum": 7,
+​      "nodeNum": 7,                                                               //对前端渲染工作是不需要的,前端可以忽略这个返回值
 
 ​      "edgeNum": 19,
 
@@ -4458,11 +4534,11 @@ allSorted: 所有值都排好序了,所有的值都为蓝色
 
 ​    },
 
-​    "content": [
+​    "content": [       //渲染的所有步骤内容,是一个数组,数组里的每一个对象是一个步骤,代表着图的一次动态变
 
-​      {
+​      {                        //化。
 
-​        "type": "visit",
+​        "type": "visit",    //type是步骤的类型,end:是
 
 ​        "end": 0,
 

+ 5 - 0
src/main/java/com/example/data_structure/controller/GraphController.java

@@ -20,6 +20,7 @@ public class GraphController {
 
     @PostMapping(value = "/graph/get-breath-first-traversal")
     public Response getGraphBreadthFirstTraversal(@RequestBody UDUWGraph graph,@RequestParam int startVertex){
+        System.out.println("==================get-breadth-first-traversal=========================");
         GraphTraversalVO vo=graphService.getBreadthFirstTraversal(graph,startVertex);
         System.out.println(vo.toString());
         return Response.buildSuccess(vo);
@@ -27,24 +28,28 @@ public class GraphController {
 
     @PostMapping(value = "/graph/get-depth-first-traversal")
     public Response getGraphDepthFirstTraversal(@RequestBody UDUWGraph graph,@RequestParam int startVertex){
+        System.out.println("==================get-depth-first-traversal=========================");
         GraphTraversalVO vo=graphService.getDepthFirstTraversal(graph,startVertex);
         return Response.buildSuccess(vo);
     }
 
     @PostMapping(value = "/graph/get-prim-minimum-spanning-tree")
     public Response getPrimMinimumSpanningTree(@RequestBody UDWGraph graph,@RequestParam int startVertex){
+        System.out.println("==================get-prim-minimum-spanning-tree=========================");
         PrimMinimumSpanningTree vo=graphService.getPrimMinimumSpanningTree(graph,startVertex);
         return Response.buildSuccess(vo);
     }
 
     @GetMapping(value = "/graph/get-new-UDUWGraph")
     public Response getNewUDUWGraph(){
+        System.out.println("==================new UDUWGraph=========================");
         UDUWGraph vo=graphService.getNewUDUWGraph();
         return Response.buildSuccess(vo);
     }
 
     @GetMapping(value = "/graph/get-new-UDWGraph")
     public Response getNewUDWGraph(){
+        System.out.println("==================new UDWGraph=========================");
         UDWGraph vo=graphService.getNewUDWGraph();
         return Response.buildSuccess(vo);
     }

+ 5 - 0
src/main/java/com/example/data_structure/controller/SortingController.java

@@ -23,6 +23,11 @@ public class SortingController {
 
     @GetMapping(value = "/bubble-sort/get-analysis-result")
     public Response getBubbleSortResult(@RequestParam String rule,@RequestParam ArrayList<Integer> content){
+        //System.out.println("==========rule:"+rule+"   content:"+contentStr+"============");
+//        ArrayList<Integer> p=new ArrayList<Integer>();
+//        p.add(3);
+//        p.add(2);
+//        p.add(1);
         BubbleSortVO vo=sortingService.getBubbleSortResult(rule,content);
         Response re=Response.buildSuccess(vo);
         return re;

+ 4 - 0
src/main/java/com/example/data_structure/service/GraphService.java

@@ -78,6 +78,7 @@ public class GraphService {
 
     //获取无向非带权图的广度优先遍历
     public GraphTraversalVO getBreadthFirstTraversal(UDUWGraph graph,int startVertex){
+        //System.out.println("+++++++startVertex: "+startVertex);
         ArrayList<ArrayList<Integer>> content=graph.getContent();
         ArrayList<Integer> visitSequence =new ArrayList<Integer>();
         ArrayList<Integer> visited=new ArrayList<Integer>();
@@ -98,9 +99,12 @@ public class GraphService {
         }
         Queue<Integer> q=new LinkedList<Integer>();
         q.add(startVertex);
+        System.out.println("+++++++startVertex: "+startVertex);
         while(!q.isEmpty()){
             int curVertex=q.poll();
+            //System.out.println("+++++++q.poll()");
             steps.add(new GraphTraversalStep("visit",visitStartNode.get(curVertex),curVertex,true));
+            System.out.println("++++++++curVertex is "+curVertex);
             visited.set(curVertex,1);
             visitSequence.add(curVertex);
             for(int i=0;i<graph.getNodeNum();i++){

+ 11 - 1
src/main/java/com/example/data_structure/service/SortingService.java

@@ -56,10 +56,15 @@ public class SortingService {
 
                 //若逆序
                 if(content.get(j)>content.get(j+1)){
+                    System.out.println("======former:"+content.get(j)+" later:"+content.get(j+1)+"=======");
                     //交换位置
                     Bar tempBar=aBar;
                     stepContent.set(j,bBar);
                     stepContent.set(j+1,tempBar);
+                    //content中的值也要交换位置
+                    int temp=content.get(j+1);
+                    content.set(j+1,content.get(j));
+                    content.set(j,temp);
                     ArrayList<Bar> copyExchangeStepContent=BubbleStep.copyContent(stepContent);
                     onSortingSteps.add(new BubbleStep("onExchange",copyExchangeStepContent));
                 }
@@ -142,6 +147,10 @@ public class SortingService {
                     Bar tempBar=aBar;
                     stepContent.set(j,bBar);
                     stepContent.set(j+1,tempBar);
+                    //content中的值也要交换位置
+                    int temp=content.get(j+1);
+                    content.set(j+1,content.get(j));
+                    content.set(j,temp);
                     ArrayList<Bar> copyExchangeStepContent=BubbleStep.copyContent(stepContent);
                     onSortingSteps.add(new BubbleStep("onExchange",copyExchangeStepContent));
                 }
@@ -349,6 +358,7 @@ public class SortingService {
         onSortingStates.add(new InsertionStep("onInsertion",0,currentContent));
         currentContent=InsertionStep.copyContent(currentContent);
         for(int i=1;i<len;i++){
+            System.out.println("================i: "+i+"============");
             currentContent.get(i).setColor("white");
             onSortingStates.add(new InsertionStep("onSelect",i,currentContent));
             currentContent=InsertionStep.copyContent(currentContent);
@@ -383,7 +393,7 @@ public class SortingService {
             currentContent=InsertionStep.copyContent(currentContent);
 
             //移动
-           for(int m=i-1;i<=exchangeIndex;i--){
+           for(int m=i-1;m>=exchangeIndex;m--){
                content.set(m+1,content.get(m));
            }
            content.set(exchangeIndex,value);