deason 1 жил өмнө
parent
commit
541676635b

+ 19 - 9
examcloud-support/src/main/java/cn/com/qmth/examcloud/commons/helpers/QuestionOptionHelper.java

@@ -26,7 +26,7 @@ public class QuestionOptionHelper {
             return String.valueOf(c);
         }
 
-        return null;
+        return "";
     }
 
     /**
@@ -37,6 +37,7 @@ public class QuestionOptionHelper {
 
         if (StringUtils.isNotEmpty(letters)) {
             char[] chars = letters.toCharArray();
+
             for (char c : chars) {
                 if (String.valueOf(c).matches("[A-Z]")) {
                     // 只处理A-Z之间的大写字母
@@ -54,11 +55,11 @@ public class QuestionOptionHelper {
      * 为了兼容旧数据需要转换为Json数字数组,如:0123456789 --> [0,1,2,3,4,5,6,7,8,9]
      */
     public static List<Integer> parseNumberOptions(String numberStr) {
-        List<Integer> numbers = new ArrayList<>();
         if (StringUtils.isEmpty(numberStr)) {
-            return numbers;
+            return new ArrayList<>();
         }
 
+        List<Integer> numbers = new ArrayList<>();
         if (numberStr.startsWith("[") && numberStr.endsWith("]")) {
             // 已经是Json数字数组的新格式数据,直接解析并返回
             String[] values = numberStr.replace("[", "").replace("]", "").split(",");
@@ -71,6 +72,7 @@ public class QuestionOptionHelper {
                 try {
                     numbers.add(Integer.parseInt(x.trim()));
                 } catch (NumberFormatException e) {
+                    // 忽略其它字符
                     log.warn("{}不可转换为数字!", x);
                 }
             }
@@ -84,26 +86,28 @@ public class QuestionOptionHelper {
             if (String.valueOf(c).matches("[0-9]")) {
                 // 只处理0-9之间的数字
                 numbers.add(c - 48);
-            } else {
-                // 忽略其它字符
             }
+            // 忽略其它字符
         }
 
         return numbers;
     }
 
     /**
-     * 解析数字,返回JSON数字数组的字符串
+     * 解析数字并排序,返回JSON数字数组的字符串
      */
     public static String parseNumbers(String numberStr) {
         List<Integer> numbers = parseNumberOptions(numberStr);
-        // 从小到大排序
-        Collections.sort(numbers);
+        if (CollectionUtils.isNotEmpty(numbers)) {
+            // 从小到大排序
+            Collections.sort(numbers);
+        }
         return "[" + StringUtils.join(numbers, ",") + "]";
     }
 
     /**
      * 比较正确答案和学生作答答案是否一致(兼容新、旧格式数据)
+     * 适用场景:单选题、多选题、判断题
      */
     public static boolean isEqualAnswer(String correctAnswer, String studentAnswer) {
         if (StringUtils.isEmpty(correctAnswer) || StringUtils.isEmpty(studentAnswer)) {
@@ -116,12 +120,17 @@ public class QuestionOptionHelper {
             return true;
         }
 
-        // 兼容判断题情况(true,false)
+        // 兼容判断题情况(true or false)
         correctAnswer = correctAnswer.replace("true", "1").replace("false", "0");
         studentAnswer = studentAnswer.replace("true", "1").replace("false", "0");
 
         List<Integer> correctAnswers = parseNumberOptions(correctAnswer);
         List<Integer> studentAnswers = parseNumberOptions(studentAnswer);
+
+        if (CollectionUtils.isEmpty(correctAnswers) || CollectionUtils.isEmpty(studentAnswers)) {
+            return false;
+        }
+
         return CollectionUtils.isEqualCollection(correctAnswers, studentAnswers);
     }
 
@@ -135,6 +144,7 @@ public class QuestionOptionHelper {
         System.out.println(isEqualAnswer("123", "[321]"));//false
         System.out.println(isEqualAnswer("true", "true"));
         System.out.println(isEqualAnswer("true", "false"));
+        System.out.println(isEqualAnswer("xxx", "x,xx"));//false
     }*/
 
 }