如何按照特定数据段对数组进行排序?

3

我有一个String类型的数组:

String[] array = { "CC/2", "DDD/3", "AAAA/4", "B/1" };
Arrays.sort(array);
System.out.println(Arrays.toString(array));

当我执行这段代码时,会得到以下结果:
[AAAA/4, B/1, CC/2, DDD/3]

这是正确的,但我希望按照数字值进行排序,以便获得以下结果:
[B/1, CC/2, DDD/3, AAAA/4]

我该如何开始进行这个操作?


6
你需要实现自己的比较器。具体方法请参考这篇文章:使用Comparator进行自定义排序 - BackSlash
5个回答

4

您可以通过使用Comparator<String>来这样做。

    /* You may found some shortcuts for this
       but following code is easy to understand 
    */
    String[] array = { "CC/2", "DDD/3", "AAAA/4", "B/1"};
    Arrays.sort(array, new Comparator<String>() {

        public int compare(String o1, String o2) {
            int i1,i2;
            /* 
               You should add some checks like 
               1] null check
               or 
               2] whether String contains / or not etc before going for further 
               code.
            */
            /* Get Numbers from String To compare */
            i1=Integer.valueOf(o1.split("/")[1]);
            i2=Integer.valueOf(o2.split("/")[1]);
            //May throw NumberFormatException so be careful with this

            if(i1>i2)
                return 1;
            else if(i1<i2)
                return -1;
            else
                return 0;
        }
    });
    System.out.println(Arrays.toString(array));//Print array

正确,但我会在方法开头添加一个检查。如果其中一个参数不包含斜杠会发生什么? - BackSlash
@BackSlash 在我的实例中总会有一个斜杠,所以一切都很好 ^^ - Kurtiss
@chetan,斜杠后面应该始终有一些内容,不过我想包括某种形式的错误处理也是个好主意。 - Kurtiss
1
感谢大家的及时回复,所有提供的示例都有效,但我选择这个作为最佳答案,因为它允许轻松进行数据操作(例如错误处理,如斜杠xp)。 - Kurtiss
1
有什么理由使用自动装箱和if语句吗?我们可以将i1和i2保留为Integer并执行i1.compareTo(i2); - Syam S

2
您需要一个自定义的比较器(Comparator):
Comparator<String> c = new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.split("/")[1].compareTo(s2.split("/")[1]);
    }
};
String[] array = { "CC/2", "DDD/3", "AAAA/4", "B/1" };
Arrays.sort(array, c);
System.out.println(Arrays.toString(array));

这将打印[B/1, CC/2, DDD/3, AAAA/4]


2
在比较之前,您需要将其转换为整数,否则字符串“10”将小于字符串“9”。;) - Syam S

2

使用自定义的Comparator并移除数字前面的字符,如下所示:

Arrays.sort(array, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.replaceAll("[A-Z]+/", "").compareTo(o2.replaceAll("[A-Z]+/", ""));
    }
});

.replaceAll("[A-Z]+/", "") 部分会移除你的字符串开头的 CC/AAAA/等内容,假设你的字符串总是以至少一个大写字母后跟一个斜杠 (/) 开头。


0

0

你需要自己编写排序函数。如果数字总是出现在字符串的末尾,你可以使用反转字符串的方法。

StringBuilder().reverse().toString()

然后您可以像以前一样对它们进行排序,然后再将它们反转回来。这将按数字顺序给您字符串,但如果您有多个具有相同数字的字符串,则它们将被倒序排序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接