【问题标题】:Java sort an array of strings (mixed with numbers and charcter) [duplicate]Java对字符串数组进行排序(与数字和字符混合)[重复]
【发布时间】:2020-09-18 13:54:43
【问题描述】:

我正在用 Java 对数组进行排序,我的输入是 {"a3", "a2", "a11", "b1", "b2", "b3", "c3", "c13", "c2 "} 我想要输出 {"a2", "a3", "a11", "b1", "b2", "b3", "c2", "c3", "c13"}

我在下面做的事情没有返回正确的结果,感谢任何建议/代码示例

import java.util.Arrays;  

public class Main
{
    public static void main(String[] args) {
        String[] var = {"a3", "a2", "a11", "b1", "b2", "b3", "c3",  "c13", "c2"};  
        Arrays.sort(var);  
        System.out.println(Arrays.toString(var));  
    }
}

从上面的代码我得到输出 [a11, a2, a3, b1, b2, b3, c13, c2, c3]

【问题讨论】:

  • 您收到的结果是字符串的自然顺序。如果您想按自然顺序(由可比较接口定义)以外的任何方式对类进行排序,那么您总是需要编写并提供自己的自定义比较器

标签: java sorting


【解决方案1】:

这是一个相对简单的方法。但是,对于这样的事情,我会创建一个类来分别保存字母和数字部分并编写一个比较器。当我打印对象时,我只需让toString() 返回原始值。

这是基本的。它不检查格式错误的字符串。

String[] var = {"a3", "a2", "a11", "b1", "b2", "b3", "c3",  "c13", "c2"};  

Comparator<String> comp = (a,b)->{
      // split the strings between the last char and the first digit 
      String[] v1 = a.split("(?<!\\d)(?=\\d)");
      String[] v2 = b.split("(?<!\\d)(?=\\d)");
      
      // convert each integer part to an int.
      int n1 = Integer.valueOf(v1[1]);
      int n2 = Integer.valueOf(v2[1]);

      // compare each and get the result
      int r1 = v1[0].compareTo(v2[0]);
      int r2 = Integer.compare(n1,n2);

      // first sort on r1 (the strings).  If they are equal ( r1 == 0) 
      // then sort on the result of comparing the integers.
      return r1 == 0 ? r2 : r1;
};

Array.sort 不采用比较器,因此您需要将数组转换为列表并对其进行排序。这也将更改数组,因为对象数组备份了从 Arrays.asList 返回的列表。

      
Collections.sort(Arrays.asList(var),comp);
System.out.println(Arrays.toString(var)); 

打印

[a2, a3, a11, b1, b2, b3, c2, c3, c13]

【讨论】:

  • 感谢您的聪明解决方案,您是救世主
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 2021-03-16
相关资源
最近更新 更多