我正在尝试使用compareToIgnoreCase对字符串数组进行排序 该字符串包含名称ex: 比利吉恩 当我尝试比较它们时,我得到一个空指针异常。我认为这是因为名字和姓氏之间的空格。我如何比较全名?
由于
class CompareStudentNames implements Comparator{
//Sorts the students by name ignoring case.
@Override
public int compare(Object o1, Object o2) {
String name1 = ((Student)o1).getName();
String name2 = ((Student)o2).getName();
return (name1.compareToIgnoreCase(name2));
}
}
编辑---在使用比较学生姓名的代码中添加
private static void newInputFileReading(File f) throws FileNotFoundException{
String inputLine = null;
String [] inputSplit = new String[7];
Boolean proceed = false;
Scanner enterReader = new Scanner(System.in);
String name;
while(!proceed){
int stunum = -1;
try {
Scanner inputReader = new Scanner(f);
while(inputReader.hasNextLine()){
studentNM.add(new Student());
++stunum;
inputLine = inputReader.nextLine();
inputSplit = inputLine.split(",");
testForWord(inputSplit);
System.out.println(inputSplit[0]);
name = inputSplit[0];
System.out.println(name);
for(int i = 1; i<8; i++){
if(i == 0){
studentNM.get(stunum).setName(name);
}// where to send the name on run 0
else if(i <= 4 && i>0){
studentNM.get(stunum).setQuiz(testForDouble(inputSplit,i), i-1);
}// where to output to runs 1-4
else if(i>4 && i <= 6){
studentNM.get(stunum).setMids(testForDouble(inputSplit,i),i-5);
}// where to output on runs 5 & 6
else if( i> 6){
studentNM.get(stunum).setFinal(testForDouble(inputSplit,i));
}// where to output on the 7th run
}// for loop to assign the inputs
}// while scanner has next
proceed = true;
Collections.sort(studentNM, new CompareStudentNames());
}//try to initalize a new scanner and get & assign the inputs
catch (FileNotFoundException e) {
proceed = false;
studentNM.clear();
System.out.println("The file appears to have gone missing, please restart the program");
System.out.println("Press Enter to continue");
enterReader.nextLine();
System.out.println("");
}// catch a file not found exception
catch(formatError | NumberFormatException e){
proceed = false;
studentNM.clear();
System.out.printf("You input file is formatted incorrectly\nEvery line must start with a word,followed by 7 numbers, seperated by commas.\nPlease reformat your file and try again.\n");
System.out.println("Press Enter to continue");
enterReader.nextLine();
System.out.println("");
}// catch format error
catch (Exception e) {
proceed = false;
studentNM.clear();
System.out.println("An unknown error occured, please restart the program");
e.printStackTrace();
System.out.println("Press Enter to continue");
enterReader.nextLine();
System.out.println("");
}
}// while to make sure the first token is a word
}// newInputFileReading
我认为Student对象没有得到名称,因为
System.out.println(studentNM.get(0).getName());
显示null;
答案 0 :(得分:6)
您应该使用学生键入您的Comoarator,即Comparator<Student>
:
class CompareStudentNames implements Comparator<Student> {
//Sorts the students by name ignoring case.
@Override
public int compare(Student o1, Student o2) {
String name1 = o1.getName();
String name2 = o2.getName();
return name1.compareToIgnoreCase(name2);
}
另外,你应该检查:
答案 1 :(得分:1)
只需使用String自己的不区分大小写的比较器:String.CASE_INSENSITIVE_ORDER
如,
Collections.sort(myStringList, String.CASE_INSENSITIVE_ORDER);
但是,只有在比较一个List或一个字符串数组时。即,List<String>
。
或
class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
// first check for nulls
return String.CASE_INSENSITIVE_ORDER.compare(s1.getName(), s2.getName());
}
}