业务序号重排序

Posted dushenzi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了业务序号重排序相关的知识,希望对你有一定的参考价值。

  场景描述:任务连续执行,任务之间存在关联关系。一个任务包含serialNo,relativeSerialNo两个关键属性。第一个任务relativeSerialNo为空,后续任务的relativeSerialNo为前一个任务的serialNo。

  需求:得到的任务列表可能是乱序的,怎么让任务列表有序。

  示例:

  原任务列表:[{serialNo:"1",relativeSerialNo:"0"},{serialNo:"0",relativeSerialNo:""},{serialNo:"2",relativeSerialNo:"1"}]

  排序后列表:[{serialNo:"0",relativeSerialNo:""},{serialNo:"1",relativeSerialNo:"0"},{serialNo:"2",relativeSerialNo:"1"}]

 

  OK,现在基于上述需求,我们来写个简单的算法实现下(主要思想:relativeSerialNo为空的作为排序列表第一个任务,后续任务的relativeSerialNo与排序列表最后一个任务的serialNo比较,相等就加入到排序序列,不相等就加到Stack栈中,等待后续加入)

 1 public class Task {
 2     private String serialNo;
 3     private String relativeSerialNo;
 4 
 5     public Task(String serialNo, String relativeSerialNo) {
 6         this.serialNo = serialNo;
 7         this.relativeSerialNo = relativeSerialNo;
 8     }
 9 
10     public String getSerialNo() {
11         return serialNo;
12     }
13 
14     public void setSerialNo(String serialNo) {
15         this.serialNo = serialNo;
16     }
17 
18     public String getRelativeSerialNo() {
19         return relativeSerialNo;
20     }
21 
22     public void setRelativeSerialNo(String relativeSerialNo) {
23         this.relativeSerialNo = relativeSerialNo;
24     }
25 
26     @Override
27     public String toString() {
28         return "serialNo=" + serialNo + ";relativeSerialNo=" + relativeSerialNo + "
";
29     }
30 }
  1 import java.io.IOException;
  2 import java.util.ArrayList;
  3 import java.util.List;
  4 import java.util.Stack;
  5 
  6 public class TaskTest {
  7     public List<Task> initTaskList() {
  8         Task task1 = new Task("202003030900", "");
  9         Task task2 = new Task("202003030902", "202003030901");
 10         Task task3 = new Task("202003030903", "202003030902");
 11         Task task4 = new Task("202003030901", "202003030900");
 12         Task task5 = new Task("202003030905", "202003030904");
 13         Task task6 = new Task("202003030906", "202003030905");
 14 
 15         List<Task> taskList = new ArrayList<Task>();
 16         taskList.add(task2);
 17         taskList.add(task1);
 18         taskList.add(task3);
 19         taskList.add(task4);
 20         taskList.add(task5);
 21         taskList.add(task6);
 22 
 23         return taskList;
 24     }
 25 
 26     public void testSort(List<Task> taskList) {
 27         long start1 = System.currentTimeMillis();
 28         System.out.println("Thead:" + Thread.currentThread().getId() + ",normal:
" + taskList.toString());
 29         System.out.println("Thead:" + Thread.currentThread().getId() + ",normal spends:" + (System.currentTimeMillis() - start1));
 30 
 31         long start2 = System.currentTimeMillis();
 32 
 33         Stack stack = new Stack();
 34         List<Task> backTaskList = new ArrayList<Task>();
 35         for (int i = 0; i < taskList.size(); i++) {
 36             Task task = taskList.get(i);
 37             if ("".equals(task.getRelativeSerialNo()) || task.getRelativeSerialNo() == null) {
 38                 backTaskList.add(task);
 39             } else {
 40                 if (backTaskList.size() > 0) {
 41                     Task backTask = backTaskList.get(backTaskList.size() - 1);
 42                     if (task.getRelativeSerialNo().equals(backTask.getSerialNo())) {
 43                         backTaskList.add(task);
 44 
 45                         Task stackTask;
 46                         Stack backStack = new Stack();
 47                         int loopCount = 0;
 48                         while(stack.size() > 0) {
 49                             loopCount++;
 50 
 51                             stackTask = (Task) stack.pop();
 52                             if (stackTask != null) {
 53                                 backTask = backTaskList.get(backTaskList.size() - 1);
 54                                 if (stackTask.getRelativeSerialNo().equals(backTask.getSerialNo())) {
 55                                     backTaskList.add(stackTask);
 56                                 } else {
 57                                     backStack.push(stackTask);
 58                                 }
 59                             }
 60                             if (stack.size() == 0) {
 61                                 stack = backStack;
 62                             }
 63 
 64                             if (loopCount > taskList.size()) {
 65                                 break;
 66                             }
 67                         }
 68                     } else {
 69                         stack.push(task);
 70                     }
 71                 } else {
 72                     stack.push(task);
 73                 }
 74             }
 75         }
 76         if (stack.size() > 0) {
 77             for (int i = 0; i < taskList.size(); i++) {
 78                 if (!backTaskList.contains(taskList.get(i))) {
 79                     backTaskList.add(taskList.get(i));
 80                 }
 81             }
 82         }
 83 
 84         taskList.clear();
 85         taskList.addAll(backTaskList);
 86 
 87         System.out.println("Thead:" + Thread.currentThread().getId() + ",sort:
" + taskList.toString());
 88         System.out.println("Thead:" + Thread.currentThread().getId() + ",sort spends:" + (System.currentTimeMillis() - start2));
 89     }
 90 
 91     public static void main(String[] args) throws IOException {
 92         TaskTest taskTest = new TaskTest();
 93 
 94         List<Task> taskList = taskTest.initTaskList();
 95         taskTest.testSort(taskList);
 96 
 97         System.out.println("Thead:" + Thread.currentThread().getId() + ",Final:
" + taskList.toString());
 98 
 99         System.in.read();
100     }
101 }

  

  运行结果展示:

Thead:1,normal:
[serialNo=202003030902;relativeSerialNo=202003030901
, serialNo=202003030900;relativeSerialNo=
, serialNo=202003030903;relativeSerialNo=202003030902
, serialNo=202003030901;relativeSerialNo=202003030900
, serialNo=202003030905;relativeSerialNo=202003030904
, serialNo=202003030906;relativeSerialNo=202003030905
]
Thead:1,normal spends:1
Thead:1,sort:
[serialNo=202003030900;relativeSerialNo=
, serialNo=202003030901;relativeSerialNo=202003030900
, serialNo=202003030902;relativeSerialNo=202003030901
, serialNo=202003030903;relativeSerialNo=202003030902
, serialNo=202003030905;relativeSerialNo=202003030904
, serialNo=202003030906;relativeSerialNo=202003030905
]
Thead:1,sort spends:0
Thead:1,Final:
[serialNo=202003030900;relativeSerialNo=
, serialNo=202003030901;relativeSerialNo=202003030900
, serialNo=202003030902;relativeSerialNo=202003030901
, serialNo=202003030903;relativeSerialNo=202003030902
, serialNo=202003030905;relativeSerialNo=202003030904
, serialNo=202003030906;relativeSerialNo=202003030905
]

 

  总结:主动思考,用技术解决业务问题。

以上是关于业务序号重排序的主要内容,如果未能解决你的问题,请参考以下文章

指令重排序

什么是重排序

为什么代码会重排序?

为什么代码会重排序?

JVM 重排序

Java 并发编程指令重排序规范 ( happens-before 先行发生原则 )