From 8bb736b37508fb0a200d812ce06f24827ac58293 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 18 Jun 2024 16:01:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20Windows=20=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E7=AE=A1=E7=90=86=E5=99=A8=E9=A3=8E=E6=A0=BC=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E6=AF=94=E8=BE=83=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../WindowsExplorerStringComparator.java | 20 ++++++++++++------- .../WindowsExplorerStringComparatorTest.java | 1 + 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16af7fe7c..6bb88fa2b 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * 【csv 】 CsvWriter.writeBeans增加重载,可选是否写出表头(issue#IA57W2@Gitee) * 【core 】 BetweenFormatter支持自定义设置单位(pr#1228@Gitee) * 【cache 】 Cache.put变更策略,对于替换的键值对,不清理队列(issue#3618@Github) +* 【core 】 添加 Windows 资源管理器风格字符串比较器(pr#3620@Github) ### 🐞Bug修复 * 【core 】 修复AnnotationUtil可能的空指针错误 diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/WindowsExplorerStringComparator.java b/hutool-core/src/main/java/cn/hutool/core/comparator/WindowsExplorerStringComparator.java index 1b3d36eba..b1561d053 100644 --- a/hutool-core/src/main/java/cn/hutool/core/comparator/WindowsExplorerStringComparator.java +++ b/hutool-core/src/main/java/cn/hutool/core/comparator/WindowsExplorerStringComparator.java @@ -1,5 +1,7 @@ package cn.hutool.core.comparator; +import cn.hutool.core.util.StrUtil; + import java.util.ArrayList; import java.util.Comparator; import java.util.Iterator; @@ -19,15 +21,19 @@ import java.util.regex.Pattern; * "abc12.doc" }},这与在资源管理器中看到的相同

* * @author YMNNs - * @see - * Java - Sort Strings like Windows Explorer + * @see Java - Sort Strings like Windows Explorer */ -public class WindowsExplorerStringComparator implements Comparator { +public class WindowsExplorerStringComparator implements Comparator { + + /** + * 单例 + */ + public static final WindowsExplorerStringComparator INSTANCE = new WindowsExplorerStringComparator(); private static final Pattern splitPattern = Pattern.compile("\\d+|\\.|\\s"); @Override - public int compare(String str1, String str2) { + public int compare(CharSequence str1, CharSequence str2) { Iterator i1 = splitStringPreserveDelimiter(str1).iterator(); Iterator i2 = splitStringPreserveDelimiter(str2).iterator(); while (true) { @@ -65,16 +71,16 @@ public class WindowsExplorerStringComparator implements Comparator { } } - private List splitStringPreserveDelimiter(String str) { + private List splitStringPreserveDelimiter(CharSequence str) { Matcher matcher = splitPattern.matcher(str); List list = new ArrayList<>(); int pos = 0; while (matcher.find()) { - list.add(str.substring(pos, matcher.start())); + list.add(StrUtil.sub(str, pos, matcher.start())); list.add(matcher.group()); pos = matcher.end(); } - list.add(str.substring(pos)); + list.add(StrUtil.subSuf(str, pos)); return list; } } diff --git a/hutool-core/src/test/java/cn/hutool/core/comparator/WindowsExplorerStringComparatorTest.java b/hutool-core/src/test/java/cn/hutool/core/comparator/WindowsExplorerStringComparatorTest.java index 1dc9beffb..24b2da770 100644 --- a/hutool-core/src/test/java/cn/hutool/core/comparator/WindowsExplorerStringComparatorTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/comparator/WindowsExplorerStringComparatorTest.java @@ -12,6 +12,7 @@ import java.util.List; * * @author YMNNs */ +@SuppressWarnings("serial") public class WindowsExplorerStringComparatorTest { List answer1 = new ArrayList() {{