2014-02-12 160 views
0

我在添加java泛型的過程中遇到了這個舊代碼,我不明白這裏發生了什麼以及需要更改什麼。需要幫助理解這種方法

static void sortByDate(List list) throws Exception 
{ 
    class MyComparator implements Comparator { 

     public int compare(Object o1, Object o2) { 

      RQEntry o11 = (RQEntry) o1; 
      RQEntry o22 = (RQEntry) o2; 

      int cc = ((String)o11.getHandledDate()).compareTo(o22.getHandledDate()); 

      return (cc < 0 ? -1 : cc > 0 ? 1 : 0); 
     } 
    }; 

    Collections.sort(list, new MyComparator()); 
} 

問題1:可能有人解釋這種方法是如何進行比較呢?

問題2:應傳遞哪些泛型類型參數以符合Java 5標準?

問題3:如何通過創建MyComparator的新實例調用compare方法?

更新:

剛剛發現這個鏈接,終於讓我明白這個代碼:http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html

+3

讀取比較器的Java文檔。這將解釋很多 –

+0

對,並閱讀'Collections.sort'的javadoc。 – pamphlet

+1

'o22.getHandledDate()'返回什麼?如果它不返回'String',那麼代碼不應該編譯。如果它返回'String',並且方法名稱有點不合適。 –

回答

1

如果你有List<RQEntry>您現在可以使用此比較排序。
RQEntry對象將根據處理日期進行比較。

這就是這裏的要求。

Collections.sort(list, new MyComparator());

在幕後,當排序算法需要比較
2個RQEntry對象,它會調用你的
比較的compare方法。就這樣。

+0

當調用new MyComparator()時會發生什麼?比較方法是否自動調用?這個類沒有默認的構造函數。 – Prince

+0

創建實例並將其傳遞給排序方法。閱讀javadoc的'sort'。 – pamphlet

+1

如果您沒有定義構造函數,則每個類都具有隱式默認構造函數。不用擔心這一點。 –

1

答案1:它正在對getHandleDate方法返回的任何內容進行字符串比較。我不知道爲什麼它是這樣做的:

return (cc < 0 ? -1 : cc > 0 ? 1 : 0); 

因爲CC應該由所有權利是-1,0或1的代碼可以很容易地做到:

return ((String)o11.getHandledDate()).compareTo(o22.getHandledDate()); 

答2:你可以使用泛型來簡化如下:

static void sortByDate(List<RQEntry> list) throws Exception 
{ 
    Collections.sort(list, new Comparator<RQEntry> { 
     public int compare(RQEntry o1, RQEntry o2) { 
      return ((String)o1.getHandledDate()).compareTo(o2.getHandledDate()); 
     } 
    }); 
} 
+0

謝謝!我是否也需要爲'MyComparator'覆蓋'equals'? – Prince

1

這段代碼可以讓你排序List日期。它假定List實際上是List<RQEntry>

Java允許您致電Collections.sort(list, new SomeComparator())。您在第二個參數中指定的比較器包含決定如何在列表中排序項目的代碼。

實際的比較接口是你需要實現int compare(Object o1, Object o2)。根據規範,如果兩個對象相同,則需要返回0,如果第一個項目在第二個項目之前排序,則爲負值,如果第二個項目在第一個項目之前排序,則爲正值。

舉個例子,如果你有含[37, 19]然後調用compare(37, 19)將返回1(假設要排序整數的升序排列的列表)的列表。

+0

謝謝!你能解釋一下如何通過創建一個MyComparator的新實例來調用compare方法嗎? – Prince

+0

@Prince這就是'Collections.sort'方法的工作原理。它需要一個「Comparator」,它是一個確保存在「比較(o1,o2)」方法的接口。 – ashes999

0
Question 1: Could someone explain how this method performs comparison? 

每個對象的getHandledDate()方法被調用和返回值(顯然String多個)進行比較(默認比較是lexicograhical排序。

棘手的部分是理解所使用的String.compareTo方法的返回值它在Comparable interface定義

Question 2: What generic type parameters should be passed to comply with Java 5 standards? 

通用類型顯然應RQEntry - 。>class MyComparator implements Comparator<RQEntry>

參見:

+0

「使用String.compareTo方法,它在Comparable接口中定義。」 - 它沒有在Comparable接口中定義,但它是String類的一種方法。 – Prince

+0

@王子是的,沒有。當然,函數的確切返回值是在String類中定義的。但是String實現了Comparable接口,它說明了這個方法:'將這個對象與指定的對象進行比較以便進行排序。返回一個負整數,零或正整數,因爲此對象小於,等於或大於指定的對象 – SebastianH