diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5129a321d..2f6552c39 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,12 +2,13 @@
# 🚀Changelog
-------------------------------------------------------------------------------------------------------------
-# 5.8.23(2023-09-20)
+# 5.8.23(2023-09-21)
### 🐣新特性
### 🐞Bug修复
* 【cron 】 修复Cron表达式range解析错误问题(issue#I82CSH@Gitee)
+* 【core 】 修复VersionComparator在极端数据排序时候违反了自反性问题(issue#I81N3H@Gitee)
-------------------------------------------------------------------------------------------------------------
# 5.8.22(2023-09-13)
diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/VersionComparator.java b/hutool-core/src/main/java/cn/hutool/core/comparator/VersionComparator.java
index 7538f8677..0e12a8389 100644
--- a/hutool-core/src/main/java/cn/hutool/core/comparator/VersionComparator.java
+++ b/hutool-core/src/main/java/cn/hutool/core/comparator/VersionComparator.java
@@ -1,15 +1,12 @@
package cn.hutool.core.comparator;
import cn.hutool.core.convert.Convert;
-import cn.hutool.core.lang.PatternPool;
-import cn.hutool.core.util.CharUtil;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.ReUtil;
-import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.*;
import java.io.Serializable;
import java.util.Comparator;
import java.util.List;
+import java.util.regex.Pattern;
/**
* 版本比较器
@@ -24,6 +21,8 @@ import java.util.List;
public class VersionComparator implements Comparator, Serializable {
private static final long serialVersionUID = 8083701245147495562L;
+ private static final Pattern PATTERN_PRE_NUMBERS= Pattern.compile("^\\d+");
+
/** 单例 */
public static final VersionComparator INSTANCE = new VersionComparator();
@@ -80,12 +79,15 @@ public class VersionComparator implements Comparator, Serializable {
if (0 == diff) {
diff = v1.compareTo(v2);
}else {
- //不同长度的先比较前面的数字;前面数字不相等时,按数字大小比较;数字相等的时候,继续按长度比较,
- int v1Num = Convert.toInt(ReUtil.get(PatternPool.NUMBERS, v1, 0), 0);
- int v2Num = Convert.toInt(ReUtil.get(PatternPool.NUMBERS, v2, 0), 0);
- int diff1 = v1Num - v2Num;
- if (diff1 != 0) {
- diff = diff1;
+ // 不同长度,且含有字母
+ if(!NumberUtil.isNumber(v1) || !NumberUtil.isNumber(v2)){
+ //不同长度的先比较前面的数字;前面数字不相等时,按数字大小比较;数字相等的时候,继续按长度比较,类似于 103 > 102a
+ final int v1Num = Convert.toInt(ReUtil.get(PATTERN_PRE_NUMBERS, v1, 0), 0);
+ final int v2Num = Convert.toInt(ReUtil.get(PATTERN_PRE_NUMBERS, v2, 0), 0);
+ final int diff1 = v1Num - v2Num;
+ if (diff1 != 0) {
+ diff = diff1;
+ }
}
}
if(diff != 0) {
diff --git a/hutool-core/src/test/java/cn/hutool/core/comparator/VersionComparatorTest.java b/hutool-core/src/test/java/cn/hutool/core/comparator/VersionComparatorTest.java
index f00f93b33..f68958d84 100644
--- a/hutool-core/src/test/java/cn/hutool/core/comparator/VersionComparatorTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/comparator/VersionComparatorTest.java
@@ -15,36 +15,59 @@ public class VersionComparatorTest {
public void versionComparatorTest1() {
int compare = VersionComparator.INSTANCE.compare("1.2.1", "1.12.1");
Assert.assertTrue(compare < 0);
+
+ // 自反测试
+ compare = VersionComparator.INSTANCE.compare("1.12.1", "1.2.1");
+ Assert.assertTrue(compare > 0);
}
@Test
public void versionComparatorTest2() {
int compare = VersionComparator.INSTANCE.compare("1.12.1", "1.12.1c");
Assert.assertTrue(compare < 0);
+
+ compare = VersionComparator.INSTANCE.compare("1.12.1c", "1.12.1");
+ Assert.assertTrue(compare > 0);
}
@Test
public void versionComparatorTest3() {
int compare = VersionComparator.INSTANCE.compare(null, "1.12.1c");
Assert.assertTrue(compare < 0);
+
+ // 自反测试
+ compare = VersionComparator.INSTANCE.compare("1.12.1c", null);
+ Assert.assertTrue(compare > 0);
}
@Test
public void versionComparatorTest4() {
int compare = VersionComparator.INSTANCE.compare("1.13.0", "1.12.1c");
Assert.assertTrue(compare > 0);
+
+ // 自反测试
+ compare = VersionComparator.INSTANCE.compare("1.12.1c", "1.13.0");
+ Assert.assertTrue(compare < 0);
}
@Test
public void versionComparatorTest5() {
int compare = VersionComparator.INSTANCE.compare("V1.2", "V1.1");
Assert.assertTrue(compare > 0);
+
+ // 自反测试
+ compare = VersionComparator.INSTANCE.compare("V1.1", "V1.2");
+ Assert.assertTrue(compare < 0);
}
@Test
public void versionComparatorTes6() {
int compare = VersionComparator.INSTANCE.compare("V0.0.20170102", "V0.0.20170101");
Assert.assertTrue(compare > 0);
+
+ // 自反测试
+ compare = VersionComparator.INSTANCE.compare("V0.0.20170101", "V0.0.20170102");
+ Assert.assertTrue(compare < 0);
}
@Test
@@ -58,5 +81,9 @@ public class VersionComparatorTest {
public void versionComparatorTest7() {
int compare = VersionComparator.INSTANCE.compare("1.12.2", "1.12.1c");
Assert.assertTrue(compare > 0);
+
+ // 自反测试
+ compare = VersionComparator.INSTANCE.compare("1.12.1c", "1.12.2");
+ Assert.assertTrue(compare < 0);
}
}
diff --git a/hutool-http/src/test/java/cn/hutool/http/Issue3314Test.java b/hutool-http/src/test/java/cn/hutool/http/Issue3314Test.java
new file mode 100644
index 000000000..65f5618ea
--- /dev/null
+++ b/hutool-http/src/test/java/cn/hutool/http/Issue3314Test.java
@@ -0,0 +1,10 @@
+package cn.hutool.http;
+
+import org.junit.Test;
+
+public class Issue3314Test {
+ @Test
+ public void postTest() {
+ String url = "https://hutool.cn/test/getList";
+ }
+}