Browse Source

公式开发
1、字符串拆分 数据匹配逻辑调整

LHB 1 day ago
parent
commit
0447dcac8d

+ 36 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/NumberStringSubtraction.java

@@ -29,7 +29,7 @@ public class NumberStringSubtraction {
 
             for (int aNum : aNumbers) {
                 // 在b数字中找到最接近且小于等于aNum的数字
-                int bestB = findClosestLessOrEqual(aNum, sortedBNumbers);
+                int bestB = findClosestWithPreference(aNum, sortedBNumbers);
                 result.add(aNum - bestB);
             }
         }
@@ -37,27 +37,49 @@ public class NumberStringSubtraction {
         return result;
     }
 
-    private static int findClosestLessOrEqual(int aNum, List<Integer> sortedBNumbers) {
-        // 默认值,如果没有找到合适的就用0
-        int closest = 0;
+    private static int findClosestWithPreference(int aNum, List<Integer> sortedBNumbers) {
+        // 如果b列表为空,返回0
+        if (sortedBNumbers.isEmpty()) {
+            return 0;
+        }
+
+        // 找到所有与aNum差值最小的数字
+        List<Integer> closestNumbers = new ArrayList<>();
         int minDiff = Integer.MAX_VALUE;
 
         for (int bNum : sortedBNumbers) {
-            if (bNum <= aNum) {
-                int diff = aNum - bNum;
-                if (diff < minDiff) {
-                    minDiff = diff;
-                    closest = bNum;
-                }
+            int diff = Math.abs(aNum - bNum);
+            if (diff < minDiff) {
+                minDiff = diff;
+                closestNumbers.clear();
+                closestNumbers.add(bNum);
+            } else if (diff == minDiff) {
+                closestNumbers.add(bNum);
+            }
+        }
+
+        // 如果只有一个最接近的数字,直接返回
+        if (closestNumbers.size() == 1) {
+            return closestNumbers.get(0);
+        }
+
+        // 如果有多个相同接近的数字,优先选择大于aNum的
+        List<Integer> greaterThanA = new ArrayList<>();
+        for (int num : closestNumbers) {
+            if (num > aNum) {
+                greaterThanA.add(num);
             }
         }
 
-        // 如果没有找到小于等于aNum的b数字,就使用最小的b数字
-        if (minDiff == Integer.MAX_VALUE && !sortedBNumbers.isEmpty()) {
-            closest = sortedBNumbers.get(0);
+        // 如果有大于aNum的数字,返回其中最小的
+        if (!greaterThanA.isEmpty()) {
+            Collections.sort(greaterThanA);
+            return greaterThanA.get(0);
         }
 
-        return closest;
+        // 如果没有大于aNum的数字,返回最大的那个(最接近但小于等于aNum的)
+        Collections.sort(closestNumbers);
+        return closestNumbers.get(closestNumbers.size() - 1);
     }
 
     private static List<Integer> parseNumbers(String str) {