2010-08-13 87 views
1

我是否正確地添加了一個元素到一個hashTable?將兩個對象添加到哈希映射?

Flows flows = new Flows(sIP,dIP); 
FlowStatics flowStatics = new FlowStatics(packetLength,timeArrival); 

HashMap myHashMap = new HashMap<Flows, FlowStatics>(); 
myHashMap.put(flows, flowStatics); 
+2

這個問題是無法回答的,因爲無論是「正道」上,完全取決於你的計劃的目的是。有一件事要注意:你用作鍵的對象必須正確實現'hashCode()'和'equals()'。 – Jesper 2010-08-13 12:02:45

+0

@紅獅:是的,這是正確的(與@Jesper提到的警告)。記住,雖然你不只是「添加兩個對象」,但是你正在創建一個('flows')和另一個('flowStatics')之間的映射,這樣你可以使用'flows'來查找'flowStatics'關鍵。 – David 2010-08-13 12:02:55

+0

發佈你的Flows類,我們可以告訴你它是否可以用作HashMap鍵 – 2010-08-13 12:04:43

回答

1

爲了避免編譯器警告,代碼像這樣替換該行

HashMap myHashMap = new HashMap<Flows, FlowStatics>(); 

HashMap<Flows, FlowStatics> myHashMap = new HashMap<Flows, FlowStatics>(); 
myHashMap.put(flows, flowStatics); 

如果不參數化的myHashMap變量,那麼你不能在沒有得到警告的情況下在第二行添加。


這裏正在研究如何 '打印' 一些HashMap的統計例如:

HashMap<Flows, FlowStatics> myHashMap = new HashMap<Flows, FlowStatics>(); 
for (int i = 0; i < 10; i++) { 
    // OP commented that the map is populated in a loop 
    myHashMap.put(createNewFlow(), createNewFlowStatistics()); // populate map 
} 
System.out.printf("Number of items in Map: %s%n", myHashMap.keyset().size()); 

(OP要求adivice到另一個答案評論)

+0

謝謝我糾正它。 – 2010-08-13 12:14:49

3

代碼看起來沒問題。

然而,你應該確保Flows覆蓋equalshashCode

+2

'hashCode',而不是'hashcode'。案例很重要! – Jesper 2010-08-13 12:04:29

0

我會改變HashMap myHashMap = new HashMap<Flows, FlowStatics>();HashMap<Flows, FlowStatics> myHashMap = new HashMap<Flows, FlowStatics>();但addig是完全地確定。

+0

但我無法打印出地圖。 – 2010-08-13 12:15:38

+0

@紅獅 - 你期望什麼樣的印刷效果? – 2010-08-13 12:25:38

+0

至少要檢查鍵集的數量和它們的值 – 2010-08-13 12:33:37

3

與這一個

Map<Flows, FlowStatics> myHashMap = new HashMap<Flows, FlowStatics>(); 
0

@Shervin

對不對?

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

是的,但您應該使用泛型,以便您不必手動投射。 您可以做的最安全的事情是請您的編輯爲您生成它。 你也可以使用Lombok(www.projectlombok.org)並註釋你的Class,它會爲你生成。 – 2010-08-13 12:17:24

+0

我不能將LomBok添加到我的ide中,因爲它不兼容。我不能這樣做,因爲我定製了我的netbeans以便與jnetpcap庫一起工作,而不是僅添加一個庫。 我不知道如何使用泛型。 但無論如何。 – 2010-08-13 12:38:36

+0

看起來很完美。我爲你添加了「implements Comparable 」,以便compareTo實際上可以使用。 – 2010-08-13 12:41:26

0

如果你不打算再次使用flowsflowStatics變量 -

HashMap<Flows, FlowStatics> myHashMap = new HashMap<Flows, FlowStatics>(); 
myHashMap.put(new Flows(sIP,dIP), new FlowStatics(packetLength,timeArrival));