我有一个包含版本字符串的列表,比如Things:
List<String> versions_list = Arrays.asList("1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2");
我想对它进行排序,结果会是这样的:
["1.0.0", "1.0.2", "1.0.12", "1.1.2", "1.3.3"]
如何在Java做到这一点。
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> 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<String> versions = Arrays.asList("1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2");
只要默认比较器不能应用于这种类型的字符串,就应该使用自定义的比较器
,否则将不会对数字进行数字排序(例如,12
被认为低于2
。
versions.sort(new Comparator<String>() {
@Override
public int compare(final String l, final String 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;
}
});
使用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;
});
这是一个非常简单的解决方案,使用Regex将版本表示法拆分成3个单独的部分。 不等于另一部分的每个部分都是数字比较的主题,因此需要integer.parseInt(String)
。
问题内容: 我创建了一个sqlite数据库,该数据库具有一个存储温度值的表。第一次将温度值以升序写入数据库。然后,我将数据库中的温度值读取到一个列表中,然后将该列表添加到组合框中以选择温度- 效果很好。 结果列表为: 然后,我向数据库添加一个新的温度值,例如“ 33”。 它被附加到表的末尾。如果我现在阅读温度,列表将变为: 如果我做或,最终的结果是 有什么简单的方法可以按升序对列表进行排序,以便得
问题内容: STRINGS.txt的示例内容: 是否可以仅使用bash对所有这些版本字符串进行排序,而最新版本位于顶部? 问题答案: 这是可能的,但工作量却很愚蠢。如果您使用GNU排序: …将完全按照您的要求进行。 现在,如果您 真的 没有任何外部工具,那么您将遇到麻烦。Freenode的#bash IRC频道上的BlastHardcheese已在本机bash中编写了以下quicksort算法,出
我创建了这个随机生成的arraylist,它生成1-50个数字。我想按升序对生成的数字进行排序。不使用集合。sort,我如何使用ArrayList进行排序?
我试图计算每个字符串中的元音,我想根据count变量交换字符串,但我做不到。在接受字符串后,我用toCharArray()函数将其转换为char数组,并将每个字符与小写和大写元音进行比较。 我收到一个错误。编写代码部分的任何帮助都将不胜感激。 输入: 输出:
如何获取字符串类型月份的升序。 如何进行asc排序请帮助
问题内容: 我有一个带有文件名的字符串列表: 输出: 但是我想要: 有没有简单的方法可以做到这一点? 问题答案: 是: 说明:字符串按词法排序,因此在字符串之前(因为< ,因此忽略第一个字符串之后的内容)。因此,我们使用的参数是一个回调函数,该函数接受一个列表项并返回用于对该项目进行排序的值- 在您的情况下,是从文件名的第一部分构建的整数。这样,列表就可以正确地按数值排序。
问题内容: 我正在通过NEST c#使用ElasticSearch。我有很多关于人的信息 我希望能够按lastName以及长度的顺序对项目列表进行过滤和排序,因此名称中只有5个字符的人会出现在结果集的开头,然后是10个字符的人。 所以我想用一些伪代码做类似的事情 我是ElasticSearch的新手,所以任何示例都将非常有帮助。 问题答案: 您可以使用基于脚本的排序进行排序。 作为一个玩具示例,我
我下面的代码不起作用,我也不知道为什么。 它编译得很好,但结果似乎没有排序。