迭代HashMap时更新Object属性

时间:2013-09-24 10:13:32

标签: java iterator hashmap

我使用的是HashMap,其中键是String,Value是一个对象(Signal)。迭代Map时我可以编辑对象的一个​​属性,然后再将其写入文件。

这是我的代码

public void createFile(HashMap<String , Signal> map, final BufferedWriter buffwriter, long totalSize) {
    final Iterator<String> iterator = map.keySet().iterator();
    while(iterator.hasNext()) {
       String messageName = iterator.next();
       Signal signal  = map.get(messageName);
       signal.setBandwidth((signal.getSize()/totalSize)*100);
       csvOutput.write(signal.getSource());
       csvOutput.write(signal.getName());
       csvOutput.write(signal.getComponent());
       csvOutput.write(Integer.toString(signal.getOccurance()));
       csvOutput.write(Integer.toString(signal.getSize()) );
       csvOutput.write(Float.toString(signal.getBandwidth()));
       csvOutput.endRecord();               
    }
 }

Signal.java

  public class Signal implements Comparable<Signal>{    
      String name;
      float bandwidth;

      public void setName(String name){
       this.name = name;
   }
      public void setBandwidth(float bandwidth){
       this.bandwidth  = bandwidth;
   }

       public String getName(){
       return this.name;
   }

       public float getBandwidth(){
       return this.bandwidth;
   }
        @Override
   public int compareTo(Signal signal) {
       return 1;
   }

在上面的代码中,我使用messagName作为地图中每个键的键,我得到它的值 尝试设置带宽属性,然后将其写入文件,但不会更新带宽。

我该怎么办?我是唯一一个选择删除条目并在迭代时添加另一个新值的选项吗?

提前致谢

2 个答案:

答案 0 :(得分:2)

我猜,你的带宽是0吗?那是因为你计算它的方式。我假设getSize()返回一个int / long,而totalSize是一个int / long。这会产生计算结果

(signal.getSize()/totalSize)*100

也是一个int。请尝试以下方法:

(signal.getSize() / (float) totalSize) * 100

现在其中一个操作数是浮点数,这也是计算结果的浮点数。希望这可以解决您的问题。

另见here

答案 1 :(得分:0)

好的,首先你可以通过引用修改任何对象状态,所以,你得到了Signal的参考,你可以设置你想要的东西(如果那个对象是可变的),那就是我要求提供代码的原因之一类。

我测试了你的例子,如下一个

 Signal signal = new Signal();
    signal.setName("1");
    signal.setBandwidth(23);
    HashMap<String , Signal> map = new HashMap<String , Signal>();
    map.put("1", signal);
    final Iterator<String> iterator = map.keySet().iterator();
    while(iterator.hasNext()) {
      String messageName = iterator.next();
      signal  = map.get(messageName);
      signal.setBandwidth(1000);
      System.out.println(signal.getBandwidth());
    }
  }

结果我会看到1000.0

BTW尝试使用EntrySet

keySet + get内容