我正在处理的任务有点问题。基本上,我有一个文件,学生证和他们的名字采用以下格式:
17987 Beth
17950 Clark
17936 Aaron
我把文件的内容放在一个数组中,我需要按名称排序,而不是ID。如果我使用Arrays.sort(myArray)
,它会按ID自动对其进行排序。我很难理解比较器,所以如果你能逐步解释它,对我来说会更容易。
谢谢!
答案 0 :(得分:6)
您需要提供Comparator
来查看传递给它的String
,并且他们必须了解他们正在寻找的内容。您可以通过几种不同的方式执行此操作,但是,如果您确定知道字符串的内容,则可以split
String
根据其空间进行比较,并比较第二个值。或者,您可以使用正则表达式来提取这些详细信息。
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]);
}
}
答案 1 :(得分:2)
使用TreeMap,条目将按键排序。
E.g:
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);
}
答案 2 :(得分:1)
你可以做的是运行一个for循环,它会将Array的所有内容重新排列成最终的数组。需要两个for循环。第一个for循环将遍历Array,第一个for循环中的for循环将查找第一个字母并将其添加到最终的Array / Arraylist。
答案 3 :(得分:1)
对于面向对象的方法,我会将文件解析为一个新类Student
,并将它们保存在一个数组(List)中。该类可以扩展Comparable<Student>
在那里,您可以将int ID
和String name
分开,并让compareTo(Student student)
方法返回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);
}
}