2010-08-13 3 views
1

Правильно ли я добавил элемент в hashTable?добавление двух объектов в hashMap?

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

+0

@Red Lion: Да, это правильно (с оговорками, о которых упоминал @ Jesper). Помните, однако, что вы не просто добавляете два объекта, вы создаете сопоставление между одним ('flow') и другим (' flowStatics'), чтобы впоследствии вы могли посмотреть 'flowStatics', используя' flow', как ключ. – David

+0

опубликуйте свой класс Flows, и мы можем сказать вам, допустимо ли его использовать в качестве ключа HashMap –

ответ

1

Чтобы избежать предупреждений компилятора, кода это следующим образом:

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()); 

(попросил ОП для adivice в комментарии к другому ответу)

+0

спасибо, что исправился. –

3

Код выглядит нормально.

Однако вы должны убедиться, что Flows переопределение equals и hashCode

+2

'hashCode', а не' hashcode'. Дело важно! – Jesper

0

Я хотел бы изменить HashMap myHashMap = new HashMap<Flows, FlowStatics>(); к HashMap<Flows, FlowStatics> myHashMap = new HashMap<Flows, FlowStatics>(); но addig Абсолютно нормально.

+0

, но я не могу распечатать карту. –

+0

@Red Lion - Какой результат печати вы ожидаете? –

+0

, по крайней мере, для проверки количества ключей и их значений –

3

Замените эту строку

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

с этим одним

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) и аннотировать свой класс, и он сгенерирует это для вас. –

+0

Я не могу добавить LomBok к своей идее, потому что не совместим с этим. и я не могу этого сделать, потому что я настроил свои netbeans для работы с библиотекой jnetpcap, и речь шла не о добавлении только одной библиотеки. Я не знаю, как использовать дженерики. , но спасибо в любом случае. –

+0

Выглядит отлично. Я добавил «инструменты Comparable » для вас, так что compareTo может быть использован. –

0

Если вы не собираетесь снова использовать flows и flowStatics переменные -

HashMap<Flows, FlowStatics> myHashMap = new HashMap<Flows, FlowStatics>(); 
myHashMap.put(new Flows(sIP,dIP), new FlowStatics(packetLength,timeArrival)); 
Смежные вопросы