mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-04-19 03:01:48 +08:00
fix bug
This commit is contained in:
parent
8fbdc2139b
commit
d3f9baf187
@ -13,15 +13,14 @@
|
|||||||
package org.dromara.hutool.core.comparator;
|
package org.dromara.hutool.core.comparator;
|
||||||
|
|
||||||
import org.dromara.hutool.core.convert.Convert;
|
import org.dromara.hutool.core.convert.Convert;
|
||||||
import org.dromara.hutool.core.regex.PatternPool;
|
import org.dromara.hutool.core.math.NumberUtil;
|
||||||
import org.dromara.hutool.core.regex.ReUtil;
|
import org.dromara.hutool.core.regex.ReUtil;
|
||||||
import org.dromara.hutool.core.text.StrUtil;
|
import org.dromara.hutool.core.text.StrUtil;
|
||||||
import org.dromara.hutool.core.text.split.SplitUtil;
|
import org.dromara.hutool.core.text.split.SplitUtil;
|
||||||
import org.dromara.hutool.core.util.ObjUtil;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 版本比较器<br>
|
* 版本比较器<br>
|
||||||
@ -33,19 +32,34 @@ import java.util.List;
|
|||||||
* @author Looly
|
* @author Looly
|
||||||
* @since 4.0.2
|
* @since 4.0.2
|
||||||
*/
|
*/
|
||||||
public class VersionComparator implements Comparator<String>, Serializable {
|
public class VersionComparator extends NullComparator<String> implements Serializable {
|
||||||
private static final long serialVersionUID = 8083701245147495562L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/** 单例 */
|
private static Pattern PATTERN_PRE_NUMBERS= Pattern.compile("^\\d+");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单例
|
||||||
|
*/
|
||||||
public static final VersionComparator INSTANCE = new VersionComparator();
|
public static final VersionComparator INSTANCE = new VersionComparator();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 默认构造
|
* 默认构造
|
||||||
*/
|
*/
|
||||||
public VersionComparator() {
|
public VersionComparator() {
|
||||||
|
this(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认构造
|
||||||
|
*
|
||||||
|
* @param nullGreater 是否{@code null}最大,排在最后
|
||||||
|
*/
|
||||||
|
public VersionComparator(final boolean nullGreater) {
|
||||||
|
super(nullGreater, (VersionComparator::compareVersion));
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 比较两个版本<br>
|
* 比较两个版本<br>
|
||||||
* null版本排在最小:即:
|
* null版本排在最小:即:
|
||||||
@ -63,43 +77,34 @@ public class VersionComparator implements Comparator<String>, Serializable {
|
|||||||
* @param version1 版本1
|
* @param version1 版本1
|
||||||
* @param version2 版本2
|
* @param version2 版本2
|
||||||
*/
|
*/
|
||||||
@Override
|
private static int compareVersion(final String version1, final String version2) {
|
||||||
public int compare(final String version1, final String version2) {
|
|
||||||
if(ObjUtil.equals(version1, version2)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (version1 == null && version2 == null) {
|
|
||||||
return 0;
|
|
||||||
} else if (version1 == null) {// null视为最小版本,排在前
|
|
||||||
return -1;
|
|
||||||
} else if (version2 == null) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
final List<String> v1s = SplitUtil.splitTrim(version1, StrUtil.DOT);
|
final List<String> v1s = SplitUtil.splitTrim(version1, StrUtil.DOT);
|
||||||
final List<String> v2s = SplitUtil.splitTrim(version2, StrUtil.DOT);
|
final List<String> v2s = SplitUtil.splitTrim(version2, StrUtil.DOT);
|
||||||
|
|
||||||
int diff = 0;
|
int diff = 0;
|
||||||
final int minLength = Math.min(v1s.size(), v2s.size());// 取最小长度值
|
final int minSize = Math.min(v1s.size(), v2s.size());// 取最小长度值
|
||||||
String v1;
|
String v1;
|
||||||
String v2;
|
String v2;
|
||||||
for (int i = 0; i < minLength; i++) {
|
for (int i = 0; i < minSize; i++) {
|
||||||
v1 = v1s.get(i);
|
v1 = v1s.get(i);
|
||||||
v2 = v2s.get(i);
|
v2 = v2s.get(i);
|
||||||
// 先比较长度
|
// 先比较长度
|
||||||
diff = v1.length() - v2.length();
|
diff = v1.length() - v2.length();
|
||||||
if (0 == diff) {
|
if (0 == diff) {
|
||||||
|
// 长度相同,直接比较字符或数字
|
||||||
diff = v1.compareTo(v2);
|
diff = v1.compareTo(v2);
|
||||||
} else {
|
} else {
|
||||||
// https://gitee.com/dromara/hutool/pulls/1043
|
// 不同长度,且含有字母
|
||||||
//不同长度的先比较前面的数字;前面数字不相等时,按数字大小比较;数字相等的时候,继续按长度比较,
|
if(!NumberUtil.isNumber(v1) || !NumberUtil.isNumber(v2)){
|
||||||
final int v1Num = Convert.toInt(ReUtil.get(PatternPool.NUMBERS, v1, 0), 0);
|
//不同长度的先比较前面的数字;前面数字不相等时,按数字大小比较;数字相等的时候,继续按长度比较,类似于 103 > 102a
|
||||||
final int v2Num = Convert.toInt(ReUtil.get(PatternPool.NUMBERS, v2, 0), 0);
|
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;
|
final int diff1 = v1Num - v2Num;
|
||||||
if (diff1 != 0) {
|
if (diff1 != 0) {
|
||||||
diff = diff1;
|
diff = diff1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (diff != 0) {
|
if (diff != 0) {
|
||||||
//已有结果,结束
|
//已有结果,结束
|
||||||
break;
|
break;
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
package org.dromara.hutool.core.comparator;
|
||||||
|
|
||||||
|
import org.dromara.hutool.core.collection.ListUtil;
|
||||||
|
import org.dromara.hutool.core.io.IoUtil;
|
||||||
|
import org.dromara.hutool.core.io.resource.ResourceUtil;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class IssueI81N3HTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void sortTest() {
|
||||||
|
final List<String> list = IoUtil.readUtf8Lines(ResourceUtil.getStream("IssueI81N3H.list"), new ArrayList<>());
|
||||||
|
ListUtil.sort(list, VersionComparator.INSTANCE.reversed());
|
||||||
|
}
|
||||||
|
}
|
257
hutool-core/src/test/resources/IssueI81N3H.list
Normal file
257
hutool-core/src/test/resources/IssueI81N3H.list
Normal file
@ -0,0 +1,257 @@
|
|||||||
|
remotes/origin/Foldn-dev
|
||||||
|
remotes/origin/HEAD -> origin/dev
|
||||||
|
remotes/origin/HOTFIX-20230519
|
||||||
|
remotes/origin/HOTFIX-20230703
|
||||||
|
remotes/origin/HOTFIX-20230705
|
||||||
|
remotes/origin/HOTFIX-20230705(1)
|
||||||
|
remotes/origin/HOTFIX-20230810
|
||||||
|
remotes/origin/HOTFIX-20230811
|
||||||
|
remotes/origin/HOTFIX-20230825
|
||||||
|
remotes/origin/HOTFIX-337-20230517
|
||||||
|
remotes/origin/HOTFIX-436
|
||||||
|
remotes/origin/HOTFIX-458
|
||||||
|
remotes/origin/HOTFIX-521
|
||||||
|
remotes/origin/HOTFIX-ESString
|
||||||
|
remotes/origin/HOTFIX-JDEV-851
|
||||||
|
remotes/origin/HOTFIX-JDEV-856
|
||||||
|
remotes/origin/HOTFIX-JDEV-978
|
||||||
|
remotes/origin/HOTFIX-LOG
|
||||||
|
remotes/origin/HOTFIX-NEWREQUIRE-216
|
||||||
|
remotes/origin/HOTFIX-remind
|
||||||
|
remotes/origin/HOTFIX-webOfficeURL
|
||||||
|
remotes/origin/HOTFiX-20230523(contractNo)
|
||||||
|
remotes/origin/JDEV-852
|
||||||
|
remotes/origin/Jarvis-20230131
|
||||||
|
remotes/origin/Jarvis-20230320
|
||||||
|
remotes/origin/Jarvis-20230322
|
||||||
|
remotes/origin/Jarvis-20230525
|
||||||
|
remotes/origin/Jarvis-20230526
|
||||||
|
remotes/origin/Jarvis-20230817
|
||||||
|
remotes/origin/Jarvis-20230830
|
||||||
|
remotes/origin/Jarvis-20230913
|
||||||
|
remotes/origin/Jarvis-Release
|
||||||
|
remotes/origin/Jarvis-kinglex
|
||||||
|
remotes/origin/JarvisCaseInsert-20230525
|
||||||
|
remotes/origin/JarvisCaseList-20230803
|
||||||
|
remotes/origin/JarvisMemberTwo-20230821
|
||||||
|
remotes/origin/JarvisNotice-20230322
|
||||||
|
remotes/origin/JarvisNoticeAndCustomer-20230728
|
||||||
|
remotes/origin/JarvisNoticeRelease-20230519
|
||||||
|
remotes/origin/JarvisTeamInvisible-20230427
|
||||||
|
remotes/origin/Jarvis_dev
|
||||||
|
remotes/origin/Jarvisdev-20230322
|
||||||
|
remotes/origin/Jerry-dev
|
||||||
|
remotes/origin/KAPP-20230227-936
|
||||||
|
remotes/origin/KDOC-511
|
||||||
|
remotes/origin/Leon-dev
|
||||||
|
remotes/origin/Lester_dev
|
||||||
|
remotes/origin/Linkin-1
|
||||||
|
remotes/origin/Linkin-dev
|
||||||
|
remotes/origin/NEWREQUIRE-157
|
||||||
|
remotes/origin/NEWREQUIRE-200(20230523)
|
||||||
|
remotes/origin/NEWREQUIRE-20230227-147
|
||||||
|
remotes/origin/NEWREQUIRE-20230303-135
|
||||||
|
remotes/origin/NEWREQUIRE-216
|
||||||
|
remotes/origin/NEWREQUIRE-247
|
||||||
|
remotes/origin/app
|
||||||
|
remotes/origin/dev
|
||||||
|
remotes/origin/dev-202303
|
||||||
|
remotes/origin/dev-202303-01
|
||||||
|
remotes/origin/dev-202303-02
|
||||||
|
remotes/origin/dev-202303-03
|
||||||
|
remotes/origin/doc
|
||||||
|
remotes/origin/fearture-20230321-vas
|
||||||
|
remotes/origin/featrues-200
|
||||||
|
remotes/origin/featrues-appDeletion
|
||||||
|
remotes/origin/featrues-dingding
|
||||||
|
remotes/origin/featrues-ftsDownZip
|
||||||
|
remotes/origin/featrues-newDataSync
|
||||||
|
remotes/origin/featrues-switchByUI
|
||||||
|
remotes/origin/featrues-webOffice
|
||||||
|
remotes/origin/featrues-wk
|
||||||
|
remotes/origin/feature-add-trace-id
|
||||||
|
remotes/origin/feature-config-use-nacos
|
||||||
|
remotes/origin/feature-doc-20230308
|
||||||
|
remotes/origin/feature-lester-20230414
|
||||||
|
remotes/origin/feature-va-invoice-lester
|
||||||
|
remotes/origin/features-alertModify
|
||||||
|
remotes/origin/features-appComprehensive
|
||||||
|
remotes/origin/features-comprehensive
|
||||||
|
remotes/origin/features-finance
|
||||||
|
remotes/origin/features-getNewId
|
||||||
|
remotes/origin/features-homeController
|
||||||
|
remotes/origin/features-pushMessage
|
||||||
|
remotes/origin/features-revenue-expenditure
|
||||||
|
remotes/origin/hotfix-20220704
|
||||||
|
remotes/origin/hotfix-20220823
|
||||||
|
remotes/origin/hotfix-20220908
|
||||||
|
remotes/origin/hotfix-20220917
|
||||||
|
remotes/origin/hotfix-20220919
|
||||||
|
remotes/origin/hotfix-20220927
|
||||||
|
remotes/origin/hotfix-20221021
|
||||||
|
remotes/origin/hotfix-20221102-docPreview
|
||||||
|
remotes/origin/hotfix-20221103
|
||||||
|
remotes/origin/hotfix-20221104
|
||||||
|
remotes/origin/hotfix-20221104-bug
|
||||||
|
remotes/origin/hotfix-20221107
|
||||||
|
remotes/origin/hotfix-20221108
|
||||||
|
remotes/origin/hotfix-20221109-docScope
|
||||||
|
remotes/origin/hotfix-20221110
|
||||||
|
remotes/origin/hotfix-20221111
|
||||||
|
remotes/origin/hotfix-20221111-ossupload
|
||||||
|
remotes/origin/hotfix-20221114
|
||||||
|
remotes/origin/hotfix-20221115
|
||||||
|
remotes/origin/hotfix-20221116
|
||||||
|
remotes/origin/hotfix-20221116-bug
|
||||||
|
remotes/origin/hotfix-20221118
|
||||||
|
remotes/origin/hotfix-20221119
|
||||||
|
remotes/origin/hotfix-20221121
|
||||||
|
remotes/origin/hotfix-20221121-fts
|
||||||
|
remotes/origin/hotfix-20221122-bug
|
||||||
|
remotes/origin/hotfix-20221124-bug
|
||||||
|
remotes/origin/hotfix-20221201
|
||||||
|
remotes/origin/hotfix-20221201-bug
|
||||||
|
remotes/origin/hotfix-20221203
|
||||||
|
remotes/origin/hotfix-20221212
|
||||||
|
remotes/origin/hotfix-20230104
|
||||||
|
remotes/origin/hotfix-20230208
|
||||||
|
remotes/origin/hotfix-20230213
|
||||||
|
remotes/origin/hotfix-20230215
|
||||||
|
remotes/origin/hotfix-20230221-fts
|
||||||
|
remotes/origin/hotfix-20230302-fileUpLoad
|
||||||
|
remotes/origin/hotfix-20230307-doc
|
||||||
|
remotes/origin/hotfix-20230314
|
||||||
|
remotes/origin/hotfix-20230315-mail
|
||||||
|
remotes/origin/hotfix-20230321-wpslog
|
||||||
|
remotes/origin/hotfix-20230322
|
||||||
|
remotes/origin/hotfix-20230322-bill
|
||||||
|
remotes/origin/hotfix-20230323
|
||||||
|
remotes/origin/hotfix-20230327
|
||||||
|
remotes/origin/hotfix-20230331
|
||||||
|
remotes/origin/hotfix-20230331-blankdoc
|
||||||
|
remotes/origin/hotfix-20230410
|
||||||
|
remotes/origin/hotfix-20230413
|
||||||
|
remotes/origin/hotfix-20230417
|
||||||
|
remotes/origin/hotfix-20230428
|
||||||
|
remotes/origin/hotfix-20230508
|
||||||
|
remotes/origin/hotfix-20230515
|
||||||
|
remotes/origin/hotfix-20230515-FINANCE-1294
|
||||||
|
remotes/origin/hotfix-20230516-FINANCE-1299
|
||||||
|
remotes/origin/hotfix-20230519
|
||||||
|
remotes/origin/hotfix-20230519-1256
|
||||||
|
remotes/origin/hotfix-20230524-FINANCE-1300
|
||||||
|
remotes/origin/hotfix-20230524-FINANCE-1352
|
||||||
|
remotes/origin/hotfix-20230524-FINANCE-1365
|
||||||
|
remotes/origin/hotfix-20230529-FINANCE-1409
|
||||||
|
remotes/origin/hotfix-20230531
|
||||||
|
remotes/origin/hotfix-20230603
|
||||||
|
remotes/origin/hotfix-20230607
|
||||||
|
remotes/origin/hotfix-20230617-INVANTORY-1466
|
||||||
|
remotes/origin/hotfix-20230707
|
||||||
|
remotes/origin/hotfix-20230710
|
||||||
|
remotes/origin/hotfix-20230713-inventory
|
||||||
|
remotes/origin/hotfix-20230720
|
||||||
|
remotes/origin/hotfix-20230722
|
||||||
|
remotes/origin/hotfix-20230724
|
||||||
|
remotes/origin/hotfix-20230726
|
||||||
|
remotes/origin/hotfix-20230727
|
||||||
|
remotes/origin/hotfix-20230731
|
||||||
|
remotes/origin/hotfix-20230803
|
||||||
|
remotes/origin/hotfix-20230804
|
||||||
|
remotes/origin/hotfix-20230805
|
||||||
|
remotes/origin/hotfix-20230817
|
||||||
|
remotes/origin/hotfix-20230817-INV-1307
|
||||||
|
remotes/origin/hotfix-20230817-INV-1492
|
||||||
|
remotes/origin/hotfix-20230818-INV-1353
|
||||||
|
remotes/origin/hotfix-20230831-INV-1531
|
||||||
|
remotes/origin/hotfix-leon-20230613
|
||||||
|
remotes/origin/hotfix-leon-20230626
|
||||||
|
remotes/origin/hotfix-leon-20230628
|
||||||
|
remotes/origin/hotfix-leon-20230717
|
||||||
|
remotes/origin/hotfix-leon-20230724
|
||||||
|
remotes/origin/hotfix-leon-20230727
|
||||||
|
remotes/origin/hotfix-lester-20230302
|
||||||
|
remotes/origin/hotfix-lester-20230303
|
||||||
|
remotes/origin/hotfix-lester-20230317
|
||||||
|
remotes/origin/hotfix-lester-20230417
|
||||||
|
remotes/origin/hotfix-remind
|
||||||
|
remotes/origin/hotfix20230614
|
||||||
|
remotes/origin/hoxfix-20220926
|
||||||
|
remotes/origin/hoxfix-20221102-bug
|
||||||
|
remotes/origin/huashang
|
||||||
|
remotes/origin/insertField
|
||||||
|
remotes/origin/inventory
|
||||||
|
remotes/origin/inventory-auto
|
||||||
|
remotes/origin/inventory-bak-20230630-dev
|
||||||
|
remotes/origin/inventory-bak-20230630-release
|
||||||
|
remotes/origin/inventory-chaos
|
||||||
|
remotes/origin/inventory-chaos-20230704-release-2
|
||||||
|
remotes/origin/inventory-fee
|
||||||
|
remotes/origin/inventory-merge
|
||||||
|
remotes/origin/inventory-release-1
|
||||||
|
remotes/origin/inventory-rpc-20230727
|
||||||
|
remotes/origin/inventory-task
|
||||||
|
remotes/origin/jarvis-20230306
|
||||||
|
remotes/origin/jarvis-qiyuesuo
|
||||||
|
remotes/origin/jarvisAppFile-20230802
|
||||||
|
remotes/origin/lester-2023-0109
|
||||||
|
remotes/origin/lester-2023-0524
|
||||||
|
remotes/origin/lester-2023-0525
|
||||||
|
remotes/origin/lester-2023-0529
|
||||||
|
remotes/origin/lester-2023-0530
|
||||||
|
remotes/origin/lester-2023-0601
|
||||||
|
remotes/origin/lester-2023-0620
|
||||||
|
remotes/origin/lester-2023-0705
|
||||||
|
remotes/origin/lester-20230311
|
||||||
|
remotes/origin/lester-20230315
|
||||||
|
remotes/origin/lester-20230406
|
||||||
|
remotes/origin/lester-20230727
|
||||||
|
remotes/origin/lester-HOTFIX-497
|
||||||
|
remotes/origin/lester-JDEV-844
|
||||||
|
remotes/origin/lester-blue-hotfix
|
||||||
|
remotes/origin/lester-dev
|
||||||
|
remotes/origin/lester-dev-20230311
|
||||||
|
remotes/origin/lester-hotfix-0714
|
||||||
|
remotes/origin/lester-hotfix-0719-2
|
||||||
|
remotes/origin/lester-hotfix-20230711
|
||||||
|
remotes/origin/lester-hotfix-20230712
|
||||||
|
remotes/origin/lester-hotfix-20230713
|
||||||
|
remotes/origin/lester-hotfix-20230714
|
||||||
|
remotes/origin/lester-hotfix-20230717
|
||||||
|
remotes/origin/lester-hotfix-20230718
|
||||||
|
remotes/origin/lester-hotfix-20230718-1
|
||||||
|
remotes/origin/lester-hotfix-20230719
|
||||||
|
remotes/origin/lester-hotfix-20230721
|
||||||
|
remotes/origin/lester-hotfix-20230724
|
||||||
|
remotes/origin/lester-hotfix-20230728
|
||||||
|
remotes/origin/lester-hotfix-202308002-1
|
||||||
|
remotes/origin/lester-hotfix-20230802
|
||||||
|
remotes/origin/lester-hotfix-20230803
|
||||||
|
remotes/origin/lester-hotfix-20230804
|
||||||
|
remotes/origin/lester-hotfix-20230807-01
|
||||||
|
remotes/origin/lester-hotfix-20230807-02
|
||||||
|
remotes/origin/lester-hotfix-20230809
|
||||||
|
remotes/origin/lester-hotfix-20230810
|
||||||
|
remotes/origin/lester-hotfix-20230811
|
||||||
|
remotes/origin/lester-hotfix-20230814
|
||||||
|
remotes/origin/lester-hotfix-20230911
|
||||||
|
remotes/origin/lester-hotfix-JDEV-864
|
||||||
|
remotes/origin/lester-hotfix-workflow-0711
|
||||||
|
remotes/origin/lester-invoice-dev
|
||||||
|
remotes/origin/lester-invoice-release
|
||||||
|
remotes/origin/lester-workHours
|
||||||
|
remotes/origin/login-register
|
||||||
|
remotes/origin/newRequire-20230110
|
||||||
|
remotes/origin/newrequire-20230216
|
||||||
|
remotes/origin/newrequire-20230529-FINANCE-1308
|
||||||
|
remotes/origin/openapi
|
||||||
|
remotes/origin/pay-20220921
|
||||||
|
remotes/origin/pc-login
|
||||||
|
remotes/origin/pety
|
||||||
|
remotes/origin/pre-dev-inventoryAuto
|
||||||
|
remotes/origin/pre-release-inventoryAuto
|
||||||
|
remotes/origin/release
|
||||||
|
remotes/origin/release-backup-2023-07-06
|
||||||
|
remotes/origin/va_dev
|
||||||
|
remotes/origin/workToolDataSync
|
||||||
|
remotes/origin/zoran
|
Loading…
x
Reference in New Issue
Block a user