1

我有这个二维字符串数组。

2 10 BakerSarah D 
2 11 SmothersSally A 
2 12 SillySall C 
2 13 Viper B 
2 5 LouieChef B 
2 6 Lawson C  

每列都是字符串。现在我想在第二列进行排序。我试过这段代码

void sortarray(final int index){
        Arrays.sort(data, new Comparator<Object[]>(){
            @Override
            public int compare(Object[] o1,  Object[] o2) {
                String[] a = (String[])o1;
                String[] b = (String[])o1;
                return a[index].compareTo(b[index]);
            }
        });

    }   

但这正在排序

    2 10 BakerSarah D 
    2 11 SmothersSally A 
    2 12 SillySall C 
    2 13 Viper B 
    2 5 LouieChef B 
    2 6 Lawson C  

为了 。为什么这样 ??如何将其更改为排序

2 5 LouieChef B 
2 6 Lawson C   
2 10 BakerSarah D 
2 11 SmothersSally A 
2 12 SillySall C 
2 13 Viper B 
4

2 回答 2

1

字符串具有自然的字典顺序。这意味着“10”在“5”之前。整数具有自然的数字顺序。因此,您应该将字符串转换为数字并比较数字:

Arrays.sort(data, new Comparator<Object[]>(){
    @Override
    public int compare(Object[] o1,  Object[] o2) {
        String[] a = (String[])o1;
        String[] b = (String[])o1;
        if (index == 2) { // lexicographic order
            return a[index].compareTo(b[index]);
        }
        else { // numeric order
            int left = Integer.parseInt(a[index]);
            int right = Integer.parseInt(b[index]);
            return Integer.compare(left, right);
        }
    }
});

请注意,如果您不使用 String[] 来保存您的信息,而是使用适当的类,并使用适当类型的字段,则不会发生这种情况:

public class Row { // choose a better name
    private int field1; // choose a better name
    private int field1; // choose a better name
    private String name;

    // constructor and getters omitted
}

Java 是一种面向对象的语言。使用对象。

于 2013-08-20T12:15:01.460 回答
1

当比较返回 0(即它们相等)时,您需要在另一个索引上进行比较。我已更新您的代码以拥有这个新索引 - index2。

void sortarray(final int index, final int index2){
    Arrays.sort(data, new Comparator<Object[]>(){
        @Override
        public int compare(Object[] o1,  Object[] o2) {
            String[] a = (String[])o1;
            String[] b = (String[])o1;
            Integer i = a[index].compareTo(b[index]);
            if (i == 0) {
               return a[index2].compareTo(b[index2]);
            } 
            return i;
        }
    });

}   

我假设(可能是错误的)您想对我的第一列进行排序,然后再按第二列排序。如果只是第二个,那么尝试@x4rf41 所说的并执行 Integer.valueOf 将字符串转换为整数

就个人而言,尽管我会创建一个对象并在其上实现Comparator以便您可以以更面向对象的方式进行排序。

于 2013-08-20T12:08:08.027 回答