二维字符串数组中基于整数的排序

时间:2013-08-20 12:05:33

标签: java arrays sorting

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

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 

2 个答案:

答案 0 :(得分: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,以便您可以更加OO方式进行排序。

答案 1 :(得分: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是一种OO语言。使用对象。