我如何对在java中格式化为高度的字符串数组列表进行排序?
Posted
技术标签:
【中文标题】我如何对在java中格式化为高度的字符串数组列表进行排序?【英文标题】:How would I sort an arraylist of strings that's formatted as a height in java? 【发布时间】:2021-12-24 11:25:48 【问题描述】: ArrayList<String> heights = new ArrayList<String>();
Comparator<String> setTableNumber = new Comparator<String>()
@Override
public int compare(String o1, String o2)
return (o1).compareTo(o2);;
Collections.sort(players, setTableNumber);
假设 heights 包含如下字符串 ["5'11"", "6'11"","4'2""]
我希望它从高到低排序,例如 ["6'11"","5'11"","4'2""]
我正在考虑使用 .split('),将字符串转换为整数,然后将英尺乘以 12,然后将其添加到第二个字符串(在我修剪掉“之后)并将两个值比较为英寸。但是有没有更好的方法呢?
提前致谢。
【问题讨论】:
但是有没有更好的方法呢?——更好的定义是什么? 我怀疑您将不得不将String
转换为更有用(和可比较)的东西
@ScaryWombat 代码行更少,效果更好
【参考方案1】:
就我个人而言,我会预先将 String
值转换为 int
(英寸),这样您就有机会处理对话期间可能出现的错误。
ArrayList<String> heights = new ArrayList<String>();
heights.add("5'11");
heights.add("6'11");
heights.add("5'2");
heights.add("4'2");
Comparator<String> setTableNumber = new Comparator<String>()
@Override
public int compare(String o1, String o2)
Integer lhs = convertToInches(o1);
Integer rhs = convertToInches(o2);
if (lhs == null)
return 1;
else if (rhs == null)
return -1;
return lhs.compareTo(rhs);
protected Integer convertToInches(String value)
String parts[] = value.split("'");
if (parts.length != 2)
return null;
return (Integer.parseInt(parts[0]) * 12) + Integer.parseInt(parts[1]);
;
Collections.sort(heights, setTableNumber);
System.out.println(heights);
打印出来的
[4'2, 5'2, 5'11, 6'11]
此工作流程会将“坏”值放在列表末尾,例如...
ArrayList<String> heights = new ArrayList<String>();
heights.add("Worse");
heights.add("5'11");
heights.add("6'11");
heights.add("5'2");
heights.add("Bad");
heights.add("4'2");
会生成
[4'2, 5'2, 5'11, 6'11, Worse, Bad]
但就个人而言,我会在尝试对列表进行排序之前处理这个问题(通过将值转换为int
)。然后,您可以在要打印时对 int
值进行一些额外的格式化
【讨论】:
所以 5'2 比 5'11 短?难怪我们不再使用脚了;你的意思是应该是 5'02 还是 5'20? 我正在努力解决这个问题,5'11 = 15575.28cm 和 5'2 = 1584.96cm,所以它“应该”工作:/ 好的,现在转换成英寸,可以打印[4'2, 5'11, 5'2, 6'11, Worse, Bad]
return Integer.parseInt(value.split("'")[0]) * 12 + Integer.parseInt(value.split("'")[1]);
输出 [4'2, 5'2, 5'11, 6'11]
@ScaryWombat 是的,“终于”到了那里——这就是世界在指标上运作的原因:P【参考方案2】:
每次比较都做很多事情是低效的。
试试这个。
public static void main(String[] args)
List<String> heights = List.of("5'11\"", "6'11\"","4'2\"");
List<String> sorted = heights.stream()
.map(s -> new Object()
String feetInch = s;
int inch;
String[] f = feetInch.replaceFirst("\"", "").split("'");
inch = Integer.parseInt(f[0]) * 12 + Integer.parseInt(f[1]);
)
.sorted(Collections.reverseOrder(Comparator.comparing(obj -> obj.inch)))
.map(obj -> obj.feetInch)
.toList();
System.out.println(sorted);
输出:
[6'11", 5'11", 4'2"]
【讨论】:
以上是关于我如何对在java中格式化为高度的字符串数组列表进行排序?的主要内容,如果未能解决你的问题,请参考以下文章
如何对在python中存储为字符串的整数列表进行排序[重复]
如何在本地时区将 java.time.Instant 格式化为字符串?