【问题标题】:How to sort an array of strings by everything but the first letter如何按除第一个字母之外的所有内容对字符串数组进行排序
【发布时间】:2020-02-13 17:08:41
【问题描述】:

对于任何字母A-Z 和数字1-26,我的数组应该包含看起来像"B1""C22" 的元素。 我需要对这个数组进行数字排序,所以我们在排序时不考虑字符串的第一个字符。这样数组{"B1", "A22", "C9"} 将被排序为{"B1", "C9", "A22"}

我尝试获取子字符串,但它不起作用,因为我不知道哪些字符串的长度为 3,哪些字符串的长度为 2。

【问题讨论】:

  • 你会如何对{"B9", "A22", "C9"}进行排序?
  • 使用substring 如果您只想获取字符串的第一个字符以外的所有内容,则无需提前知道确切的长度。有 2 个 substring 方法,一个只是将 beginIndex 作为参数,并自动将从 beginIndex 到字符串结尾的所有内容添加到返回的字符串中。所以你只需要一个简单的substring(1) 调用。

标签: java arrays sorting


【解决方案1】:

您可以创建自己的比较器来忽略某些字符:

Arrays.sort(s, new MyComparator());
System.out.println(Arrays.toString(s));

class MyComparator implements Comparator<String> {


    @Override
    public int compare(String o1, String o2) {

        // Remove the chars you are want to ignore from o1, o2 
        o1 = o1.substring(1);
        o2 = o2.substring(1);
        return Integer.compare(Integer.parseInt(o1),Integer.parseInt(o2));
        // return o1.compareTo(o2); see petr note bellow
    }
}

【讨论】:

  • 考虑到它应该比较Integer.compare(Integer.parseInt(o1.substring(1)), Integer.parseInt(o2.substring(1)))(不仅仅是字符串)的问题。
  • 根据 OP 希望“B9”和“C9”相对于彼此排序的方式,我会检查 Integer.compare 的返回值,如果是 0,则返回 o1.compareTo(o2) 作为平局断路器。
【解决方案2】:

如果数组包含大量元素,则可以将Arrays.sort() 替换为Arrays.parallelSort() 以进行高效排序。

Arrays.sort(arr, 
    (ele1, ele2) -> ele1.substring(1).compareTo(ele2.substring(1)));

如果您确信substring(1) 只包含数值,那么您可以按如下方式排序:

Arrays.sort(arr, (Comparator.comparingInt(element -> 
                            Integer.parseInt(element.substring(1)))));

【讨论】:

    猜你喜欢
    • 2011-03-10
    • 2022-05-22
    • 2021-01-03
    • 2021-07-19
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    相关资源
    最近更新 更多