From 7c67b839bb1e6c75d22bfd6a0248082e4d092d05 Mon Sep 17 00:00:00 2001 From: C-H716 <1536152356@qq.com> Date: Fri, 24 Oct 2025 00:20:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=88=97=E8=A1=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=87=AA=E7=84=B6=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/screen/ProviderSelectScreen.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/main/java/com/extendedae_plus/client/screen/ProviderSelectScreen.java b/src/main/java/com/extendedae_plus/client/screen/ProviderSelectScreen.java index 1953093..4b4b141 100644 --- a/src/main/java/com/extendedae_plus/client/screen/ProviderSelectScreen.java +++ b/src/main/java/com/extendedae_plus/client/screen/ProviderSelectScreen.java @@ -10,6 +10,8 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * 简单的供应器选择弹窗。 @@ -322,6 +324,32 @@ public class ProviderSelectScreen extends Screen { fCount.add(gCount.get(i)); } } + + // 对 fNames 进行自然排序,同时同步其它列表 + List indices = new ArrayList<>(); + for (int i = 0; i < fNames.size(); i++) indices.add(i); + indices.sort((i1, i2) -> compareNatural(fNames.get(i1), fNames.get(i2))); + + List sortedIds = new ArrayList<>(); + List sortedNames = new ArrayList<>(); + List sortedSlots = new ArrayList<>(); + List sortedCount = new ArrayList<>(); + + for (int idx : indices) { + sortedIds.add(fIds.get(idx)); + sortedNames.add(fNames.get(idx)); + sortedSlots.add(fTotalSlots.get(idx)); + sortedCount.add(fCount.get(idx)); + } + + fIds.clear(); + fIds.addAll(sortedIds); + fNames.clear(); + fNames.addAll(sortedNames); + fTotalSlots.clear(); + fTotalSlots.addAll(sortedSlots); + fCount.clear(); + fCount.addAll(sortedCount); } // 优先使用 JEC 的拼音匹配,否则回退到大小写不敏感子串匹配 @@ -357,6 +385,29 @@ public class ProviderSelectScreen extends Screen { return name.toLowerCase(Locale.ROOT).contains(keyLower); } + // 自然排序比较方法 + private static final Pattern NATURAL_PATTERN = Pattern.compile("(\\D*)(\\d*)"); + private static int compareNatural(String s1, String s2) { + Matcher m1 = NATURAL_PATTERN.matcher(s1); + Matcher m2 = NATURAL_PATTERN.matcher(s2); + + while (m1.find() && m2.find()) { + // 比较非数字部分 + int cmp = m1.group(1).compareTo(m2.group(1)); + if (cmp != 0) return cmp; + + // 比较数字部分 + String num1 = m1.group(2); + String num2 = m2.group(2); + if (!num1.isEmpty() || !num2.isEmpty()) { + int n1 = num1.isEmpty() ? 0 : Integer.parseInt(num1); + int n2 = num2.isEmpty() ? 0 : Integer.parseInt(num2); + if (n1 != n2) return Integer.compare(n1, n2); + } + } + return s1.length() - s2.length(); + } + @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (searchBox != null && searchBox.keyPressed(keyCode, scanCode, modifiers)) {