2010-10-09 89 views
1

我有一個班學生 - int age,int height和name;數組排序比較方法總是進行默認比較

我有n個學生課程的對象,我嘗試按年齡排序,如果有領帶,那麼按高度排序,如果有領帶隨機名稱。

我有一個類

class StudentComparator implements Comparator{ 

public int compare(Object 1, Object2) 
{ 
    // Logic 
} 

} 

我有一個主類

class StudentSorter { 

    // Initialise student objects etc 
    // Have an array of students: students[]    
    Array.Sort(students,new StudentComparator()) 

    // print values 

} 

我面臨的問題是,輸出不類似我在StudentComparator類的比較方法的邏輯。 邏輯是:

if(Student1.age > student2.age) 
    { 
       return 1; 
    }  
    else if(Student1.age < student2.age) 
    { 
       return -1; 
    } 
    else 
    { 
     if(Student1.height > Student2.height) 
        return 1; 
     else if(Student1.height < Student2.height) 
       return -1; 
      else 
       return 0; 


     } 

輸入: 15 6約翰 16 5薩姆 17 6魯尼

輸出:(不管我如何用邏輯玩耍,甚至評論吧)

17  6  Rooney 
16  5  Sam 
15  6  John 

可能是什麼問題?

+0

你應該表現出給定的結果和通緝的結果,以及你所使用的邏輯。 – 2010-10-09 22:43:07

+1

您是否嘗試在比較器方法中使用斷點或插入打印語句來查看發生了什麼? – ide 2010-10-09 22:44:32

+3

向我們展示您真正使用的代碼。而不是'Array.Sort',排序方法的正確名稱是'Arrays.sort'。你在這個語句的最後還缺少一個分號。你也許應該讓'StudentComparator'實現'Comparator '。這使您的代碼更容易。並且不要在比較器中做任何隨機事情。這是'Comparator.compare'方法的規範所禁止的。詳細信息請閱讀文檔。 – 2010-10-09 22:48:51

回答

0

如果第一個值是年齡,按年齡排序,則輸出是正常的。

+0

我的問題是,即使當我改變邏輯輸出保持不變。如果(Student1.age> student2.age) { }返回-1,那麼我的邏輯意思是假設我做了類似 的事情; } else if(Student1.age Student2.height) 返回-1; 否則如果(Student1.height 2010-10-09 23:00:01

+0

@Eternal學習,做你重新編譯?你確定你正在使用你的代碼的最後一個版本嗎? – 2010-10-09 23:00:52

+0

是啊,我也重新編譯我的代碼 - 而我得到的結果相同每次我改變邏輯 – 2010-10-09 23:03:54

1

您的學生訂購正確。你剛剛得到的訂單方向錯了。

package so3898183; 

import java.util.Comparator; 

public class StudentComparator implements Comparator<Student> { 

    @Override 
    public int compare(Student student1, Student student2) { 
    if (student1.age < student2.age) 
     return -1; // if the first student is "smaller", return something small 
    if (student1.age > student2.age) 
     return 1; // if the first student is "larger", return something large 

    if (student1.height < student2.height) 
     return -1; 
    if (student1.height > student2.height) 
     return 1; 

    return 0; 
    } 

} 

一些言論,其他的解決方案:

  • 不要使用減去student1.age - student2.age的「絕招」和檢查結果的符號。這會溢出大量數據,並可能產生不正確的結果。
  • 保持您的代碼儘可能簡單易讀。
  • 如果不需要,請不要分配額外的對象(例如在另一個響應中提出的int[])。
2

你可以試試這個:

public int compare(Student s1, Student s2) 
{ 
    return s1.age == s2.age ? s1.height - s2.height : s1.age - s2.age; 
}