2010-08-13 184 views
0

這裏是我的compareTo方法,但即時通訊仍然收到「缺少返回語句」警告。 任何人都可以告訴我我的代碼有什麼問題嗎?如何覆蓋compareTo方法

public int compareTo(Flows other) { 
    if(this.srcAddr.equals(other.srcAddr)){ 
     if(this.dstAddr.equals(other.dstAddr)){ 
       if(this.srcPort.equals(other.srcPort)){ 
        if(this.dstPort.equals(other.dstPort)){ 
         if(this.protocol.equals(other.protocol)){ 
          return 0; 
         } 
        } 
       } 
     } 
} 
} 
+1

首先,爲什麼這個社區wiki?其次,如果'this.srcAddr.equals(other.srcAddr)'爲false,請考慮返回的內容;]。 – pablochan 2010-08-13 09:30:06

+0

相信我你不能正確實現這個,直到你真的知道你想如何訂購你的「MyKey」對象:)首先決定你的業務邏輯是什麼。 – Gopi 2010-08-13 09:35:34

+0

@Gopi,你的意思是,Flows對象? – aioobe 2010-08-13 09:39:51

回答

0

只是在函數的末尾添加「return 1」(或任何東西),它應該可以解決問題。

+0

其實我做了,但它沒有奏效。 – 2010-08-13 09:34:12

+0

public int compareTo(Flows other)if(this.srcAddr.equals(other.srcAddr)){if(this.dstAddr.equals(other.dstAddr)){ if(this.srcPort.equals(other。如果(this.dstPort.equals(other.dstPort)){ if(this.protocol.equals(other.protocol)){ return 0; } } } } } else return 1; } – 2010-08-13 09:36:16

+2

你說「'返回1」(或任何東西)「 - 這將解決編譯錯誤問題,但不是'compareTo'合同違反問題。 – polygenelubricants 2010-08-13 09:55:58

1

這是因爲您的代碼有可能爲compareTo返回任何內容!想想如果所有這些if語句都失敗了,那麼它會觸發方法的結尾,而不會返回任何東西。你需要一個回報進一步下跌:

public int compareTo(Flows other) { 
    if(this.srcAddr.equals(other.srcAddr)){ 
     if(this.dstAddr.equals(other.dstAddr)){ 
      if(this.srcPort.equals(other.srcPort)){ 
       if(this.dstPort.equals(other.dstPort)){ 
        if(this.protocol.equals(other.protocol)){ 
         return 0; 
        } 
       } 
      } 
     } 
    } 
    return 1; 

}

而且你是不是做一個完整的比較。如果它們相等,則需要返回0;如果差值小於0,則小於0;如果大於0,則大於0。這看起來你會更好,最重要的是平等!

也許是這樣的:

public boolean equals(Flows other) { 
    return (this.srcAddr.equals(other.srcAddr) && this.dstAddr.equals(other.dstAddr) && this.srcPort.equals(other.srcPort) && this.dstPort.equals(other.dstPort) && this.protocol.equals(other.protocol)); 
+0

即時比較兩個對象的5個字段只是爲了查看是否已經存在該對象。平等是我對這種情況的興趣。 – 2010-08-13 09:49:58

+0

然後重寫我有的等於方法 – BeRecursive 2010-08-13 09:52:30

+0

。但即時通訊使用sortedMap數據結構。我需要實現compareTo,equal和hashCode。我做了其他兩個,但不compareTo。 compareTo的目的是檢查不相等的順序。 – 2010-08-13 10:14:11

0

這將編譯和運行,但對於合同的休息嗎?小於和大於?

public int compareTo(Flows other) { 

    int value = 0; 

    if(this.srcAddr.equals(other.srcAddr)){ 
     if(this.dstAddr.equals(other.dstAddr)){ 
       if(this.srcPort.equals(other.srcPort)){ 
        if(this.dstPort.equals(other.dstPort)){ 
         if(this.protocol.equals(other.protocol)){ 
          value = 0; 
         } 
        } 
       } 
     } 

    return value; 
} 
+3

這個代碼在任何情況下都返回0。 – 2010-08-13 09:45:16

+0

是的,我明白了,但是打破了compareTo合同。 – duffymo 2010-08-13 13:01:59

2

這看起來像一個equals方法。如果目的僅僅是爲了比較,如果兩者是一樣的,我會做類似

return srcAddr.equals(other.srcAddr) && 
     dstAddr.equals(other.dstAddr) && 
     srcPort.equals(other.srcPort) && 
     dstPort.equals(other.dstPort) && 
     protocol.equals(other.protocol); 

如果它意向,你可能打破的compareTo的合同,因爲你的方法沒有按」 t似乎堅持傳遞性要求。從Comparable文檔:

實現類還必須確保關係是可傳遞

+0

我使用sortedMap和我需要實現compareTo方法有我的領域,我想要的順序。這就是爲什麼我要這樣。 – 2010-08-13 09:41:52

+0

好吧,請記住,您的compareTo方法必須在* transitive *的Flow對象上實現關係。 – aioobe 2010-08-13 10:02:32

5

兩件事情:

  • 你得到「失蹤return語句」,因爲有路沒有返回值的執行。例如,當第一個if語句計算爲false時。

  • 您打破了compareTo()合同。對於以下調用:a.compareTo(b),結果應爲爲:如果a等於b,則爲0,<如果a小於b,則爲0;如果a大於b,則爲> 0。看來你正在使用compareTo()來檢查是否相等,在這種情況下,正確的方法是重寫equals()方法。