使用比较器基于字符串中的字符对字符串数组进行排序

时间:2017-09-01 15:56:46

标签: java arrays string sorting comparator

所以我尝试使用Comparator对字符串数组进行排序,但排序基于字符串的长度,然后是字符串的第三个字符。

到目前为止,这是我的比较器:

class StringSorter implements Comparator<String> {
    public int compare(String s1, String s2) {
        if(s1.length() < s2.length()) {
            return -1;
        }
        if(s1.length() > s2.length()) {
            return 1;
        }    
        return s1.charAt(3)+"".compareTo(s2.charAt(3)+"");
    }
}//Comparator

此行return s1.charAt(3)+"".compareTo(s2.charAt(3)+"");是我到目前为止的尝试,我得到一个IndexOutOfBoundsException,但我的数组中的每个字符串至少有4个长度,所以我不明白错误的原因。

至于我的问题,为什么我会收到这个错误?如果我根据字符串中的长度和字符进行排序,我应该如何编写我的比较器?

编辑:我需要处理的数组遵循这种格式

{"1:bbbbb", "2:aaa", "=:ccc", "1:qqqq", "1:eeee", "=:zzz", "1:vvv", "2:oooo", "=:eee", "1:fffff"}

2 个答案:

答案 0 :(得分:2)

您的代码运行正常。我在这里稍微调整了一下,向您展示如何使其更具弹性。

class StringSorter implements Comparator<String> {
    private final int pos;

    public StringSorter(int pos) {
        this.pos = pos;
    }

    public int compare(String s1, String s2) {
        if (s1.length() < s2.length()) {
            return -1;
        }
        if (s1.length() > s2.length()) {
            return 1;
        }
        if ( s1.length() <= pos ) {
            return s1.compareTo(s2);
        }
        return Character.compare(s1.charAt(pos),s2.charAt(pos));
    }
}

public void test() {
    String[] test2 = {"1:bbbbb", "2:aaa", "=:ccc", "1:qqqq", "1:eeee", "=:zzz", "1:vvv", "2:oooo", "=:eee", "1:fffff"};
    System.out.println("Before: " + Arrays.toString(test2));
    Arrays.sort(test2, new StringSorter (2));
    System.out.println("After:  " + Arrays.toString(test2));
}

打印:

  

之前:[1:bbbbb,2:aaa,=:ccc,1:qqqq,1:eeee,=:zzz,1:vvv,2:oooo,=:eee,1:fffff]

     

之后:[2:aaa,=:ccc,=:eee,1:vvv,=:zzz,1:eeee,2:oooo,1:qqqq,1:bbbbb,1:fffff]

我怀疑你使用3表示第3个字符 - 这是错误的。 3rd字符位于2;

请记住 - 字符串中的第n个字符由[n-1]索引,因为第一个字符位于0

答案 1 :(得分:1)

这是使用三元运算符解决问题的方法。

简单的单线比较方法。

class StringSorter implements Comparator<String> {

    @Override
    public int compare(String s1, String s2) {
        return s1.length() - s2.length() != 0 ? s1.length() - s2.length() :  new Character(s1.charAt(2)).compareTo(s2.charAt(2));
    }
}