Java程序,用于按升序对版本控制字符串进行排序
我有一个包含版本字符串的列表,例如:Java程序,用于按升序对版本控制字符串进行排序,java,sorting,versioning,Java,Sorting,Versioning,我有一个包含版本字符串的列表,例如: List<String> versions_list = Arrays.asList("1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"); 如何在Java中执行此操作。假设: List<String> versions = Arrays.asList("1.1.2", &qu
List<String> versions_list = Arrays.asList("1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2");
如何在Java中执行此操作。假设:
List<String> versions = Arrays.asList("1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2");
。。。使用lambda表达式
versions.sort((l, r) -> {
String[] left = l.split("\\.");
String[] right = r.split("\\.");
int iterableLength = Math.min(left.length, right.length);
for (int i=0; i<iterableLength; i++) {
if (!left[i].equals(right[i])) {
return Integer.parseInt(left[i]) - Integer.parseInt(right[i]);
}
}
return 0;
});
versions.sort((l,r)->{
字符串[]左=l.split(\\);
字符串[]right=r.split(“\\”);
int iterableLength=Math.min(left.length,right.length);
对于(int i=0;i您可以使用如下所示:
List<String> sorted = List.of("1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2")
.stream()
.sorted((s1, s2) -> {
String[] s1Parts = s1.split("\\.");
String[] s2Parts = s2.split("\\.");
Integer[] s1IntParts = Arrays.stream(s1Parts).map(Integer::parseInt).toArray(Integer[]::new);
Integer[] s2IntParts = Arrays.stream(s2Parts).map(Integer::parseInt).toArray(Integer[]::new);
int comparisonResult = -1;
for (int i=0; i<3; i++) {
comparisonResult = Integer.compare(s1IntParts[i], s2IntParts[i]);
if (comparisonResult != 0) {
break;
}
}
return comparisonResult;
})
.collect(Collectors.toList());
List sorted=List.of(“1.1.2”、“1.0.0”、“1.3.3”、“1.0.12”、“1.0.2”)
.stream()
.已排序((s1,s2)->{
字符串[]s1Parts=s1.split(“\\”);
字符串[]s2Parts=s2.split(“\\”);
Integer[]s1IntParts=Arrays.stream(s1Parts).map(Integer::parseInt).toArray(Integer[]::new);
整数[]s2IntParts=Arrays.stream(s2Parts).map(Integer::parseInt).toArray(Integer[]::new);
int comparisonResult=-1;
对于(int i=0;i
对不起,我再次输入代码
输出:1.0.0 1.0.2 1.0.12 1.1.2 1.3.3,您也可以使用cycle!这里有一个现代的解决方案,使用比较器。比较以基于预先存在的标准库数组构建版本字符串比较器。比较(int[])
方法
List<String> versionList = Arrays.asList("1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2");
Pattern pattern = Pattern.compile("\\.");
Comparator<String> versionComparator = Comparator.comparing(
str -> pattern.splitAsStream(str)
.mapToInt(Integer::parseInt)
.toArray(),
Arrays::compare);
versionList.sort(versionComparator);
System.out.println(versionList);
List versionList=Arrays.asList(“1.1.2”、“1.0.0”、“1.3.3”、“1.0.12”、“1.0.2”);
Pattern=Pattern.compile(“\\”);
Comparator versionComparator=Comparator.Comparating(
str->pattern.splitAsStream(str)
.mapToInt(整数::parseInt)
.toArray(),
数组::比较);
sort(versioncompactor);
System.out.println(版本列表);
这里有一种方法使用比较器的lambda。处理不同长度的版本ID
Comparator<String> comp = (a, b) -> {
String[] aa = a.split("\\.");
String[] bb = b.split("\\.");
int r = 0;
for (int i = 0; i < Math.min(aa.length, bb.length); i++) {
r = Integer
.compare(Integer.valueOf(aa[i]),Integer.valueOf(bb[i]));
if (r != 0) {
return r;
}
}
return Integer.compare(aa.length, bb.length);
};
List<String> versions_list = Arrays.asList("1.1.2", "1.0.0",
"1.3.3", "1.0.12", "1.0.0.12", "1.1.0.2", "1.0.2", "1.2.1.2.3");
versions_list.sort(comp);
System.out.println(versions_list);
首先,提供一个有效的Java代码。是否保证版本总是以a.B.C
的形式,或者像a.B
或a.B.C.D
这样的版本也是可能的?不要重新发布一个新的答案。只需更正你的旧答案。好的,我比较新鲜。我应该编辑我的旧答案吗?不。这次不。不要担心。欢迎使用Stack Overf低。:)好的,谢谢!我记得。
public static void main(String[] args) {
String[] versions_list = {"1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"};
Arrays.sort(versions_list, (o1, o2) -> {
String[] str1 = o1.split("\\.");
String[] str2 = o2.split("\\.");
if (!Integer.valueOf(str1[0]).equals(Integer.valueOf(str2[0])))
return Integer.valueOf(str1[0]) - Integer.valueOf(str2[0]);
if (!Integer.valueOf(str1[1]).equals(Integer.valueOf(str2[1])))
return Integer.valueOf(str1[1]) - Integer.valueOf(str2[1]);
return Integer.valueOf(str1[2]) - Integer.valueOf(str2[2]);
});
for (String str : versions_list) {
System.out.println(str);
}
}
List<String> versionList = Arrays.asList("1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2");
Pattern pattern = Pattern.compile("\\.");
Comparator<String> versionComparator = Comparator.comparing(
str -> pattern.splitAsStream(str)
.mapToInt(Integer::parseInt)
.toArray(),
Arrays::compare);
versionList.sort(versionComparator);
System.out.println(versionList);
Comparator<String> comp = (a, b) -> {
String[] aa = a.split("\\.");
String[] bb = b.split("\\.");
int r = 0;
for (int i = 0; i < Math.min(aa.length, bb.length); i++) {
r = Integer
.compare(Integer.valueOf(aa[i]),Integer.valueOf(bb[i]));
if (r != 0) {
return r;
}
}
return Integer.compare(aa.length, bb.length);
};
List<String> versions_list = Arrays.asList("1.1.2", "1.0.0",
"1.3.3", "1.0.12", "1.0.0.12", "1.1.0.2", "1.0.2", "1.2.1.2.3");
versions_list.sort(comp);
System.out.println(versions_list);
[1.0.0, 1.0.0.12, 1.0.2, 1.0.12, 1.1.0.2, 1.1.2, 1.2.1.2.3, 1.3.3]