2012-04-04 171 views
27

我正在做作業,需要有人帶我走過一些東西。我正在學習數組,基本上我有一個收集姓氏,名字和分數的數組。 我需要編寫一個compareTo方法來比較姓氏和名字,這樣就可以按姓氏的字母順序對姓名進行排序,然後如果兩個人有相同的姓氏,那麼它將排序第一個姓名。compareTo方法java

我很困惑,因爲所有的在我的書的信息比較數字,而不是對象或我猜字符串?我認爲在使用數組時,字符串被認爲是對象。 這真的讓我很困惑,所以如果somone可以通過它我會很感激。 這是我迄今爲止編碼的內容,但我知道這是錯誤的,但至少可以解釋我認爲我在做什麼。

public int Compare(Object obj) // creating a method to compare 
{ 
    Student s = (Student) obj; //creating a student object 

    // I guess here I'm telling it to compare the last names? 
    int studentCompare = this.lastName.compareTo(s.getLastName()); 

    if (studentCompare != 0) 
     return studentCompare; 
    else 
    { 
     if (this.getLastName() < s.getLastName()) 
      return - 1; 

     if (this.getLastName() > s.getLastName()) 
      return 1; 
    } 
    return 0; 

} 

我知道<>符號是錯誤的,但就像我說我的書只能說明你是如何給我們使用,我認爲號碼compareTo方法是一種不公平的期望我瞭解如何比較的對象。

+0

如果你可以說'someString cHao 2012-04-04 19:01:45

回答

23

這是比較字符串的正確方法:

int studentCompare = this.lastName.compareTo(s.getLastName()); 

這甚至不會編譯:

if (this.getLastName() < s.getLastName()) 

使用 if (this.getLastName().compareTo(s.getLastName()) < 0)代替。

所以比較拳頭/姓的順序,你需要:

int d = getFirstName().compareTo(s.getFirstName()); 
if (d == 0) 
    d = getLastName().compareTo(s.getLastName()); 
return d; 
+0

我同意你構造if語句的方式。第一個錯誤。 – LatheElHafy 2017-10-18 18:03:29

1

if (s.compareTo(t) > 0)將字符串s比較串T和返回你想要的int值。

public int Compare(Object obj) // creating a method to compare { 
     Student s = (Student) obj; //creating a student object 

     // compare last names 
     return this.lastName.compareTo(s.getLastName());  
    } 

現在只需測試正常情況下的正負回報即可。

乾杯

1

你幾乎都在那裏。

您的前幾行比較姓氏的方式正確。字符串上的compareTo()方法將按字母順序返回一個負數,之後按字母順序返回一個正數。

現在,你只需要爲你的名字和得分做同樣的事情。

換句話說,如果姓氏1 ==姓氏2,請繼續檢查您的名字。如果名字相同,請檢查您的分數。 (考慮嵌套if/then塊。)

+0

那麼你是說我不需要從if(studentcompare!= 0)開始的代碼,因爲上面那行已經返回正數和負數? – 2012-04-04 18:54:23

0

String是Java中的對象。

你可以比較像這樣,

if(this.lastName.compareTo(s.getLastName() == 0)//last names are the same 
1

考慮使用Comparator接口描述here它使用泛型這樣就可以避免鑄造ObjectStudent

正如Eugene Retunsky所說,您的第一部分是比較String的正確方法。另外,如果lastName等於,我認爲你的意思是比較firstName,在這種情況下,只需以相同的方式使用compareTo即可。

18

CompareTo方法描述如下:

比較與指定對象此對象爲順序。返回 負整數,零或正整數,因爲此對象比指定對象小 ,等於或大於此指定對象。

比方說,我們希望通過他們的年齡比較Jedis:

class Jedi implements Comparable<Jedi> { 

    private final String name; 
    private final int age; 
     //... 
} 

那麼,如果我們的絕地比提供一個較舊的,你必須返回一個積極的,如果它們是相同的年齡,你返回0,如果我們的絕地年輕,你會返回一個負數。

public int compareTo(Jedi jedi){ 
    return this.age > jedi.age ? 1 : this.age < jedi.age ? -1 : 0; 
} 

通過實施compareTo方法(從Comparable接口來)你要定義什麼叫做自然順序。 JDK中的所有排序方法將默認使用此訂購

您可能希望將您的比較基於其他對象,而不是基本類型。例如,copare Jedis根據他們的名字。在這種情況下,如果被比較的對象已經實現了Comparable,那麼您可以使用其compareTo方法進行比較。

public int compareTo(Jedi jedi){ 
    return this.name.compareTo(jedi.getName()); 
} 

在這種情況下會更簡單。

現在,如果您傾向於使用名稱和年齡作爲比較標準,那麼您必須決定比較的優先級。例如,如果兩個傑迪斯的名字相同,那麼你可以用他們的年齡來決定哪個先走,哪個走第二個。

public int compareTo(Jedi jedi){ 
    int result = this.name.compareTo(jedi.getName()); 
    if(result == 0){ 
     result = this.age > jedi.age ? 1 : this.age < jedi.age ? -1 : 0; 
    } 
    return result; 
} 

如果你有Jedis

Jedi[] jediAcademy = {new Jedi("Obiwan",80), new Jedi("Anakin", 30), ..} 

數組所有你需要做的就是要問類java.util.Arrays使用它的排序方法。

Arrays.sort(jediAcademy); 

Arrays.sort方法將使用你的compareTo方法的對象逐一排序。

+0

要添加,您可以選擇是否通過交換-1,1的位置作爲返回值來按升序或降序顯示列表的順序 – fardown 2017-03-20 00:49:01

0

我不會有一個Object類型參數,如果我們知道它將始終是Student類型,那麼它就不會將它轉換爲Student。

至於說明,只有當姓氏是相同的時候纔會出現「result == 0」,在這一點上,我們比較第一個姓名並返回該值。

public int Compare(Object obj) 
{  
    Student student = (Student) obj; 
    int result = this.getLastName().compareTo(student.getLastName()); 

    if (result == 0) 
    { 
     result = this.getFirstName().compareTo(student.getFirstName()); 
    } 

    return result; 
} 
2

收聽@milkplusvellocet,我建議你爲你的類實現Comparable接口。

只是助長別人的答案:

String.compareTo()會告訴你一個字符串是如何不同的是從另一個。

例如System.out.println("Test".compareTo("Tesu"));將打印-1 和System.out.println("Test".compareTo("Tesa"));將打印19

和書呆子和令人討厭的單行解決這一任務將是:

return this.lastName.equals(s.getLastName()) ? this.lastName.compareTo(s.getLastName()) : this.firstName.compareTo(s.getFirstName());

說明:

this.lastName.equals(s.getLastName())檢查lastnames是否是是否相同 this.lastName.compareTo(s.getLastName())如果是,則返回姓氏的比較。 this.firstName.compareTo(s.getFirstName())如果不是,則返回名字的比較。