2016-09-27 77 views
1
具有多個字段的僱員對象

考慮下面的情況:使用單個比較器接口進行排序在Java

假設有僱員具有類屬性:的eID,易名,EAGE,eAddress,eDeptName並且能夠更在將來基於被添加要求。

此Employee對象被添加到hashmap中作爲鍵和字符串作爲值。

考慮主類下面的代碼:

 class Test 
    { 
     public static void main(String[] args) 
     { 
      Map<Employee,String> m = new HashMap<>(); 
      //Adding object in to map 
      m.put(e1,"one"); 
      m.put(e2,"two"); 
      m.put(e3,"othree"); 
     } 
    } 

現在我需要用比較器界面基於員工對象在地圖上進行排序。

我的問題是: -

1)什麼是最好的常用方式排序的員工對象:通過使用單獨的比較的每個字段或使用單一的比較對所有字段

2)如何爲所有字段使用單個比較器以及如何調用它?

在此先感謝

+0

你有Java 8嗎? –

+0

不,我正在使用java 7 –

回答

0

實施取決於您。但是,您必須確定如何定義如何將員工與其他員工進行比較。例如,他們是通過ID進行比較的?名稱?年齡?

您可以在比較方法中使用所有字段的組合,其中一些是有意義的,或者只是其中一種。

由於Comparator是一個接口,因此您必須重寫compare和equals方法,並定義您將在其中比較哪些屬性的邏輯。

0

讓員工實現Comparable接口,並在compareTo()方法中包含所需的所有字段。然後,如果您只是使用TreeMap而不是HashMap,則您的地圖項目將自動排序。

1

1)什麼是排序的員工對象最好的常用辦法:使用單獨的比較的每個字段或使用的所有領域

沒有最好的方式單一的比較,但只你需要什麼。您可以爲每個字段分別設置比較器,以便按特定字段對列表進行排序。您將有更多的選擇,以便您的列表如何排序。

或者當你需要它們作爲決勝者時,你可以在同一比較器中使用多個字段。但是你必須決定哪個是主要的分類標準,哪些是次要標準。

在作決定時,問自己:

  • 關於設計的重用。將它們分組爲1比較比分離更有用嗎?
  • 如果將它們分組爲1個比較器,那麼再次使用它的可能性是多少?
  • 哪一個更靈活使用?
  • 哪一個更容易維護?

2)如何使用單個比較了各個領域,如何使用它?

如果你想使用所有的領域,說4個領域:nameagesalarygender(用我自己的領域爲例)

您只選擇1場,你是用作排序標準的興趣。其他3個領域將被用作決勝隊。

假設你按name排序。當出現兩個相似的名字時,可以使用第二個字段作爲決勝球,如age

如果有多名僱員具有相同的姓名和年齡,請按第3條標準對其進行排序,也可以通過salary進行排序。如果所有3個字段都相似,則按照第4條標準gender對它們進行排序。

//example: 
class EmployeeComparator implements Comparator<Employee>{ 
    @Override 
    public int compare(Employee e1, Employee e2){ 
     int cmp = e1.getName().compareTo(e2.getName()); 
     if(cmp == 0) 
      cmp = e1.getAge() - e2.getAge(); 
     if(cmp == 0) 
      cmp = e1.getSalary() - e2.getSalary(); 
     if(cmp == 0) 
      cmp = e1.getGender().compareTo(e2.getGender()); 
     return cmp; 
    } 
}