我如何对在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 格式化为字符串?

如何将列表标签中的数字(通过 Combat)格式化为幂符号?

将 IP:Port 字符串格式化为

c# 拼接字符串并转化为json数据时,总是无法转到所需格式