2010-08-13 45 views
0

,如果我需要自定義代碼才能使用這個邏輯如何自定義compareTo方法同時考慮方向流動

if this.srcAddr=other.srcAddr or 
this.src.Addr = other.sdstAddr 
this.srcPort=other.srcPort 
this.srcPort=other.dstPort 

,因爲我要考慮的雙向流動,從源數據包的目的地和分組從目的地到源頭屬於一個流程。

我該如何更改我的代碼?

package myclassifier; 
public class Flows implements Comparable<Flows> { 

    String srcAddr, dstAddr, srcPort, dstPort, protocol; 

    public Flows(String sIP, String dIP){ 
     this.srcAddr = sIP; 
     this.dstAddr = dIP; 
    } 

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

    @Override 
    public int hashCode() { 

     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((dstAddr == null) ? 0 : dstAddr.hashCode()); 
     result = prime * result + ((dstPort == null) ? 0 : dstPort.hashCode()); 
     result = prime * result + ((srcAddr == null) ? 0 : srcAddr.hashCode()); 
     result = prime * result + ((srcPort == null) ? 0 : srcPort.hashCode()); 
     return result; 

    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 

     if (getClass() != obj.getClass()) 
      return false; 

     Flows other = (Flows) obj; 

     if (dstAddr == null) { 
      if (other.dstAddr != null) 
       return false; 
     } else if (!dstAddr.equals(other.dstAddr)) 
      return false; 

     if (dstPort == null) { 
      if (other.dstPort != null) 
       return false; 
     } else if (!dstPort.equals(other.dstPort)) 
      return false; 

     if (srcAddr == null) { 
      if (other.srcAddr != null) 
       return false; 
     } else if (!srcAddr.equals(other.srcAddr)) 
      return false; 

     if (srcPort == null) { 
      if (other.srcPort != null) 
       return false; 
     } else if (!srcPort.equals(other.srcPort)) 
      return false; 

     return true; 
    } 

} 
+0

請修正代碼的格式,關閉compareTo方法的}沒有縮進。 – 2010-08-13 18:47:30

+0

只爲了解它?你想兩個不同的'Flaws'實例將'srcPort'和'dstPort'切換(分別)被認爲是相同的? – whiskeysierra 2010-08-13 20:18:48

+0

是的,也是港口。 – 2010-08-13 23:35:04

回答

0

只是一個猜測,但我認爲你要尋找的是沿着以下線的東西(空檢查,類型檢查和錯誤處理作爲練習留給用戶):

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

請注意,這是基於以下假設:從機器1端口b到機器2端口a的連接與從機器1端口a到機器2端口b的連接不相同。

+0

恰恰是我想的那個。 – 2010-08-13 19:52:50

+1

只需返回您在'if'中使用的表達式,而不是具有這些多餘的返回語句。 – whiskeysierra 2010-08-13 20:16:01

+0

更新了,對不起,當我最初寫這篇文章的時候,我已經睡着了。 – 2010-08-16 15:37:53

0

您可以大大簡化compareTo方法。你只是比較字符串,如果你只是連接所有的字符串和一個單一的比較,你會得到相同的結果。下面的示例添加一個toString()實現作爲獎金:

@Override 
public String toString() { 
    return String.format("[%s, %s, %s, %s, %s]", srcAddr, dstAddr, srcPort, dstPort, protocol); 
} 

public int compareTo(Flows other) { 
    if (other == null) 
    return 0; // the necessary null check was missing in your code 

    return toString().compareTo(other.toString()); 
} 

如果您需要更多的性能,可以考慮構建連接字符串,而你構建一個流並將其存儲在私有字段。

+0

對不起,我不完全明白。它是如何工作的?如果我給它跟着兩個流srcAddr = x,dstAddr = y,srcPort = 12345,dstPort = 80,pro = tcp AND srcAddr = y,dstAddr = x,srcPort = 80,dstPort = 12345,pro = tcp 假設他們是一樣的? – 2010-08-13 19:28:03

+0

不,它不會。 – whiskeysierra 2010-08-13 20:20:20

+0

@紅獅 - 對不起,我的文本不是你的'反之亦然'問題的答案,它只是簡化你當前的代碼。但是你的最後一個例子澄清了你想要的東西 - 你想要一個考慮兩個流程(從你的例子)是平等的測試。 – 2010-08-13 20:30:45