2016-10-15 27 views
0

好Day-與比較工作<T>

我的工作中,我已經指令來創建一個命名爲void sortByAthleteNames()方法,該方法將執行以下任務的任務:

排序列表運動員用名字和姓氏對象。此方法調用在排序類中定義的類型的方法,使用AthleteNameComparator類的對象作爲其第二個參數

排序類具有以下實現:

public class Sorts { 

    public static void sort(ArrayList<Athlete> objects,Comparator<Athlete> comparator) 
    { 
     //TODO 
    } 
} 

你的排序方法利用比較方法的參數Comparator對象進行排序。您可以使用選擇排序或插入排序之一。

sortByAthleteNames()方法implemetation:

public void sortByAthleteNames() { 
     AthleteNameComparator athleteNameComparator = new AthleteNameComparator();  
     Sorts.sort(athleteList, **CONFUSED WHAT TO PASS HERE**); 
    } 

AthleteNameComparator類具有以下指令:

的AthleteNameComparator類實現 「比較器」 的接口。 它需要定義以下方法,這是從比較接口繼承的抽象方法:

公衆詮釋比較(第一個對象,對象秒) (請注意,您也可以定義: 公衆詮釋比較(運動員第一,運動員第二) 通過不是使類實現比較

爲此,我已經創建了一個類,這是如下:

AthleteNameComparator

public class AthleteNameComparator implements Comparator<Athlete>{ 

    @Override 
    public int compare(Athlete o1, Athlete o2) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
} 

而且我們有以下的指令,我們需要同樣的方法來實現這一點,那些如下:

如果第一個參數對象有一個姓字典順序比的少第二個參數,返回一個小於零的int值。如果第一個參數對象的姓氏按字典順序大於第二個參數,則返回大於零的int值。如果他們的姓氏相同,則應對他們的名字進行比較。如果他們有相同的名字和姓氏,那麼應該返回0。

我很困惑。我的問題是我如何執行關係運算符,因爲姓氏的datatypeString並返回-1/1或0.我已經搜索了很多,根據我的理解,我可以如何比較這些。請確認這是否是正確的方法?

public class AthleteNameComparator{ 

    public int compare(Athlete a1, Athlete a2) { 

     if(a1.getLastName().hashCode() < a2.getLastName().hashCode()) 
     { 
      return -1; 
     } 
     else if(a1.getLastName().hashCode() > a2.getLastName().hashCode()) 
     { 
      return 1; 
     } 
     else if(a1.getLastName().hashCode() == a2.getLastName().hashCode()) 
     { 
      if(a1.getFirstName().hashCode() == a2.getFirstName().hashCode()) 
      { 
       return 0; 
      } 
     } 
     return 100; 
    } 
} 

但是又一次爲什麼我們要這樣做?我們可以用-1/1或0來達到什麼目的。你也可以請解釋一下它的後續工作。我需要首先處理哪些事情,以及何時從compare()方法獲得成功響應,那麼如何使用插入或選擇排序中的返回值。

很多謝謝

+2

不要使用'hashCode'。它不保證字典(或任何)的順序。改爲使用[String.compareTo](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#compareTo(java.lang.String))。 –

+0

很多很好的信息在這裏:http://stackoverflow.com/questions/369512/how-to-compare-objects-by-multiple-fields – Marichyasana

回答

1

使用比較器進行排序是Java中的標準事情。有關它的工作原理以及爲什麼compare方法必須返回負值/正值/ 0值,請在網絡和/或教科書中查找教程和其他資源。

要求一個特定的班級名稱真的很愚蠢,因爲AthleteNameComparator,但假設它是一個學校作業,你應該順其自然。

排序的通話很簡單:

Sorts.sort(athleteList, athleteNameComparator); // **SEE WHAT TO PASS HERE** 

您的AthleteNameComparator骨架是正確的。您可以填寫方法,如:

@Override 
public int compare(Athlete o1, Athlete o2) { 
    int diffLastName = o1.getLastName().compareTo(o2.getLastName()); 
    if (diffLastName == 0) { // last names are equal 
     return o1.getFirstName().compareTo(o2.getFirstName()); 
    } else { 
     return diffLastName; 
    } 
} 

一旦你得到了它的竅門,寫的比較簡單:你只需通過(代表)的任務,以適當的compareTo(更很少到另一個比較的compare法)它會返回正確的負值或正值或0值。你甚至不需要跟蹤哪個是哪個,只要你把左手邊(o1)和右手邊(o2)放在正確的地方。

如果不是因爲在類名的要求,sortByAthleteNames()可以用的代碼,只需幾行包括比較(假設的Java 8)寫成:

public void sortByAthleteNames() { 
    Sorts.sort(athleteList, Comparator.comparing(Athlete::getLastName).thenComparing(Athlete::getFirstName)); 
} 

如果我理解正確的,你仍然有大部分工作在你面前:執行Sorts.sort()。如果您使用比較元素的排序算法(例如e1 < e2)開始,則必須將其替換爲comparator.compare(e1, e2) < 0。始終使用與原始算法相同的關係運算符,並且應該順利進行。

希望它有幫助。