繁体   English   中英

我将如何对在 Java 中格式化为高度的字符串数组列表进行排序?

[英]How would I sort an arraylist of strings that's formatted as a height in java?

    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);

假设高度包含这样的字符串 ["5'11"", "6'11"","4'2""]

我希望它从高到低排序,如 ["6'11"","5'11"","4'2""]

我正在考虑使用 .split('),将字符串转换为整数,然后将英尺乘以 12,然后将其添加到第二个字符串(在我修剪掉“之后”)并将两个值作为英寸进行比较。但是有有更好的方法吗?

提前致谢。

就个人而言,我会预先将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值进行一些额外的格式化

尝试这个。

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"]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM