2013-09-01 102 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()); 
    } 
}