1

我正在处理的任务有一点问题。基本上,我有一个文件,其中包含学生 ID 和他们的名字,格式如下:

17987 贝丝

17950 克拉克

17936 亚伦

我将文件的内容放在一个数组中,我需要按名称而不是 ID 对其进行排序。如果我使用Arrays.sort(myArray)它,它将按 ID 自动排序。我很难理解比较器,所以如果你能一步一步地解释它,对我来说会更容易。谢谢!

4

4 回答 4

6

您需要提供一个Comparator可以查看String传递给它的 s 的内容,并且他们必须了解他们正在寻找的内容。您可以通过几种不同的方式来执行此操作,但是,如果您确定字符串的内容,那么您可以split根据String它们的空间来比较 s 并比较第二个值。或者,您可以使用正则表达式来提取这些详细信息。

class SecondWordComparator implements Comparator<String>
{
    @Override
    public int compare(String s1, String s2)
    {
        String[] a1 = s1.split(" ");
        String[] a2 = s2.split(" ");

        // you should ensure that there are actually two elements here
        return a1[1].compareTo(a2[1]);
    }
}
于 2013-03-04T20:49:24.040 回答
2

使用TreeMap,条目将按键排序。

例如:

SortedMap<String, Integer> srtdMap  = new TreeMap<String, Integer>();

srtdMap.put("Beth", 17987);
srtdMap.put("Aaron", 17936 );
srtdMap.put("Clark", 17950);

//key set always returns the same order by name
for(String name : srtdMap.keySet())
{
    int id = srtdMap.get(name);
    System.out.println("name = " + name + ", ID is " + id);
}
于 2013-03-04T20:54:52.937 回答
1

您可以做的是运行一个 for 循环,将 Array 的所有内容重新排列为最终数组。需要两个 for 循环。第一个 for 循环将遍历 Array,第一个 for 循环将查找第一个字母并将其添加到最终的 Array/Arraylist 中。

于 2013-03-04T20:51:25.760 回答
1

对于面向对象的方法,我会将文件解析为一个新类,Student并将它们保存在一个数组(列表)中。该类可以Comparable<Student>在那里扩展,您可以将 theint ID和 the分开String name并让compareTo(Student student)方法 return name.compareTo(otherStudent.name)。然后你可以调用 sort 方法,它会根据需要对其进行排序。

像这样:

public class Student implements Comparable<Student> {
    private int id;
    private String name;
    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }
    @Override
    public int compareTo(Student student) {
        return name.compareTo(student.name);
    }

}
于 2013-03-04T20:53:48.933 回答