2013-09-01 45 views
0

我想使用compareToIgnoreCase对字符串数组进行排序。
该字符串包含名称例如: 比利牛仔
当我尝试比较它们时,我得到一个空指针异常。我认为这是因为名字和姓氏之间的空白。我如何比较全名?Java比较器compareToIgnoreCase

感谢

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()); 

显示为空;

+1

你必须在使用'CompareStudentNames'的代码粘贴,所以我们可以看到如何创建和填写你的'Student'对象。 –

+1

你在开始你的for循环'i = 1',但是设置名字'if(i == 0)'。 –

+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); 
} 

此外,你应该检查:

  • 你不整理空 - 尤其是对(初始化)阵列的一个问题 /数组元素
  • 学生都有(非null)名字
+0

你是对的我正在排序nulls,因为我开始我的为1不是0.谢谢 –

1

只要使用字符串自己不区分大小写的比较:String.CASE_INSENSITIVE_ORDER

例如,

Collections.sort(myStringList, String.CASE_INSENSITIVE_ORDER); 

但是,只有当你比较字符串列表或数组。即,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()); 
    } 
}