1
0
Prechádzať zdrojové kódy

数字大题号+字符串小题号组合排序工具

luoshi 1 rok pred
rodič
commit
61be3d8754

+ 54 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/QuestionNumberBean.java

@@ -0,0 +1,54 @@
+package cn.com.qmth.stmms.biz.utils;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 题号排序对象的抽象接口
+ */
+public interface QuestionNumberBean {
+
+    int getMainNumber();
+
+    String getSubNumber();
+
+    default Integer[] getSubNumbers() {
+        String subNumber = getSubNumber();
+        if (subNumber == null) {
+            return ArrayUtils.EMPTY_INTEGER_OBJECT_ARRAY;
+        }
+        int count = 0;
+        List<Integer> list = new LinkedList<>();
+        StringBuilder buffer = new StringBuilder();
+        int length = subNumber.length();
+        for (int i = 0; i < length; i++) {
+            char c = subNumber.charAt(i);
+            //数字字符
+            if (c >= '0' && c <= '9') {
+                buffer.append(c);
+            }
+            //非数字字符,转换已累计数字
+            else if (buffer.length() > 0) {
+                try {
+                    list.add(Integer.parseInt(buffer.toString()));
+                    count++;
+                } catch (Exception e) {
+                    //
+                }
+                buffer.setLength(0);
+            }
+        }
+        if (buffer.length() > 0) {
+            try {
+                list.add(Integer.parseInt(buffer.toString()));
+                count++;
+            } catch (Exception e) {
+                //
+            }
+            buffer.setLength(0);
+        }
+        return list.toArray(new Integer[count]);
+    }
+}

+ 71 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/QuestionNumberComparator.java

@@ -0,0 +1,71 @@
+package cn.com.qmth.stmms.biz.utils;
+
+import java.util.Comparator;
+
+/**
+ * 针对大题号+小题号组合情况的通用排序工具
+ */
+public class QuestionNumberComparator implements Comparator<QuestionNumberBean> {
+
+    public static final QuestionNumberComparator instance = new QuestionNumberComparator();
+
+    @Override
+    public int compare(QuestionNumberBean b1, QuestionNumberBean b2) {
+        //比较大题号
+        int i = b1.getMainNumber() - b2.getMainNumber();
+        if (i != 0) {
+            return i;
+        }
+        //获取小题号数组
+        Integer[] numbers1 = b1.getSubNumbers();
+        Integer[] numbers2 = b2.getSubNumbers();
+        for (int j = 0; ; j++) {
+            Integer n1 = j < numbers1.length ? numbers1[j] : null;
+            Integer n2 = j < numbers2.length ? numbers2[j] : null;
+            if (n1 == null && n2 == null) {
+                break;
+            }
+            //位数短的优先
+            if (n1 == null) {
+                return -1;
+            }
+            if (n2 == null) {
+                return 1;
+            }
+            i = n1 - n2;
+            //某一位比较出大小则返回
+            if (i != 0) {
+                break;
+            }
+        }
+        return i;
+    }
+
+    public static void main(String[] args) {
+        QuestionNumberBean b1 = new QuestionNumberBean() {
+
+            @Override
+            public int getMainNumber() {
+                return 1;
+            }
+
+            @Override
+            public String getSubNumber() {
+                return "10-1";
+            }
+        };
+        QuestionNumberBean b2 = new QuestionNumberBean() {
+
+            @Override
+            public int getMainNumber() {
+                return 1;
+            }
+
+            @Override
+            public String getSubNumber() {
+                return "1-10";
+            }
+        };
+        System.out.println(QuestionNumberComparator.instance.compare(b1, b2));
+    }
+}