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() {{