2010-08-13 4 views
1

Ai-je correctement ajouté un élément à un hashTable?ajoutant deux objets à un hashMap?

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

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

Cette question est sans réplique, parce que si elle est « la bonne voie » dépend entièrement de ce que le but de votre programme est. Une chose à noter: L'objet que vous utilisez comme clé doit implémenter 'hashCode()' et 'equals()' correctement. – Jesper

+0

@Red Lion: Oui, c'est vrai (avec les mises en garde que @Jesper mentionné). Souvenez-vous cependant que vous n'êtes pas seulement en train d'ajouter deux objets, vous créez un mapping entre un ('flows') et un autre (' flowStatics'), de sorte que vous pouvez ensuite rechercher 'flowStatics' en utilisant' flows' comme une clé. – David

+0

poster votre classe Flows et nous pouvons vous dire si elle est acceptable pour une utilisation comme une clé HashMap –

Répondre

1

Pour éviter les avertissements du compilateur, le code comme ceci:

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

Si vous ne paramétrisent pas la variable myHashMap , alors vous ne pouvez pas ajouter dans la deuxième ligne sans avoir des avertissements.


Voici l'exemple de travail sur la façon de 'print' des statistiques de 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 demandé adivice dans un commentaire à une autre réponse)

+0

merci, je l'ai corrigé. –

3

Le code semble correct.

Cependant, vous devez vous assurer que Flows override equals et hashCode

+2

'hashCode', pas' hashcode'. Le cas est important! – Jesper

0

Je change HashMap myHashMap = new HashMap<Flows, FlowStatics>(); à HashMap<Flows, FlowStatics> myHashMap = new HashMap<Flows, FlowStatics>(); mais le addig est ok completly.

+0

mais je ne peux pas imprimer la carte. –

+0

@Red Lion - Quel type de résultat d'impression attendez-vous? –

+0

au moins pour vérifier le nombre de jeux de clés et leurs valeurs –

3

Remplacez cette ligne

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

avec celui-ci

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

@Shervin

est-ce que c'est juste?

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

Oui, mais vous devez utiliser des génériques, de sorte que vous n'ayez pas à lancer manuellement. La chose la plus sûre que vous pouvez faire est de demander à votre éditeur de le générer pour vous. Vous pouvez aussi utiliser Lombok (www.projectlombok.org) et annoter votre classe, et cela générera cela pour vous. –

+0

Je ne peux pas ajouter LomBok à mon idée parce que ce n'est pas compatible avec ça. et je ne peux pas le faire parce que j'ai customisé mes netbeans afin de fonctionner avec la bibliothèque de jnetpcap et il ne s'agissait pas d'ajouter une seule bibliothèque. Je ne sais pas comment utiliser les génériques. mais merci quand même. –

+0

semble parfait. J'ai ajouté "implements comparables " pour vous, de sorte que compareTo peut effectivement être utilisé. –

0

Si vous n'allez utiliser les flows et flowStatics les variables à nouveau -

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