按多列排序数组

时间:2014-12-29 19:30:59

标签: java arrays sorting 2d

我有

等数据 学生一个12 22 78

学生二21 24 83

学生三10 12 67

在数据文件中他们是大约35名学生

它们是一种将数据存储在数组中然后对最后一个颜色值中的数据进行排序的方法。

我有这个,并且我认为我需要使用比较器功能,但这会允许我排序,因为数组是用于字符串但包含数字

    String[][] aryStudents = new String[4][4];
    aryStudents[0][1] = "Student1";
    aryStudents[0][2] = "12";
    aryStudents[0][3] = "22";
    aryStudents[0][4] = "73";
    aryStudents[1][1] = "Student2";
    aryStudents[2][2] = "12";
    aryStudents[3][3] = "22";
    aryStudents[4][4] = "84";

4 个答案:

答案 0 :(得分:2)

您可以通过编写自定义比较器对象来完成此操作:

Comparator<String[]> comp = new Comparator<>() {
    @Override
    public int compare(String[] student1, String[] student2) {
        // comparison logic goes here
        // return:
        //    a negative number if student1 goes before student2
        //    0 if student1 is tied with student2
        //    a positive number if student1 goes after student2
    }
};

然后你可以用:

排序
Arrays.sort(aryStudents, comp);

正如其他答案所暗示的那样,最好定义一个Student类来封装学生的数据。然后,您可以定义类本身来实现Comparable<Student>(在这种情况下,比较逻辑将被修复),或者您可以如上定义Comparator<Student>对象(参数除(Student student1, Student student2)之外(String[] student1, ...))。

编辑:既然你在评论中提到了,那么比较逻辑可能会如何运作。如果分数总是两位数并用零填充(例如,得分为8将为"08"),那么您可以简单地使用

return student1[3].compareTo(student2[3]);

这是一个词典比较,可以满足您的需求。如果得分为8将由"8"表示,那么这将无效。相反,您必须将分数解析为int值并进行比较。只要整数只有两位或三位数,一个很好的捷径就是:

return Integer.parseInt(student1[3]) - Integer.parseInt(student2[3]));

我使用3作为最后一个元素的索引,因为在你的问题代码中你已经为每个学生声明了数组长度为4。

答案 1 :(得分:2)

使用面向对象的方法。

创建一个班级Student,每个学生都有一个名字和一个标记列表。然后创建一个Student数组并对其进行排序,提供自定义比较器。您可以使用二维数组实现排序,但是增加了一定程度的复杂性。

public class Student {
    private String name;
    private List<Integer> grades; 

    //Constructor, getter, setter, equals, hashcode, etc.
}

Java是一种面向对象的编程语言,所以要使用它。

答案 2 :(得分:0)

数组用于字符串,但您可以使用Integer.parseInt将其转换为int。然后迭代所有子数组并检查最后一个值;把它放在比较器中

public int compare(String[] s1, String[] s2) {
    int last = Integer.parseInt(s1[s1.length - 1]);
    int last2 = Integer.parseInt(s2[s2.length - 1]);
    return Integer.compare(last, last2);
}

未经测试,因为我在移动设备上无法测试。

答案 3 :(得分:-1)

小心数组第一个索引从第0个元素开始。你的解决方案将抛出StringIndexOutOfBoundsException