【问题标题】:Update Object attribute while iterating over HashMap迭代 HashMap 时更新对象属性
【发布时间】:2013-09-29 12:01:29
【问题描述】:

我正在使用 HashMap,其中键是字符串,值是对象(信号)。在遍历 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 作为映射中每个键的键,我得到了它的值 尝试设置带宽属性,然后写入文件,但没有更新带宽。

我该怎么做?我剩下的唯一选择是删除条目并在迭代时添加另一个具有新值的条目吗?

提前致谢

【问题讨论】:

  • Signal 类和方法的代码在哪里设置和获取带宽?
  • 我也说一下
  • 请提供totalSize的声明。如果它的值为 100,则带宽将保持为 signal.getSize()。只是为了检查。
  • 检查更新,totalSize 是 long 类型,我将其作为参数传递给我想要更新带宽并将地图写入文件的方法
  • 我在 Signal 中没有看到 signal.getSize()?

标签: java iterator hashmap


【解决方案1】:

好的,首先你可以通过引用修改任何对象状态,所以,你得到了 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

顺便说一句,尝试使用EntrySet insted of keySet + get

【讨论】:

  • salsolatragus 提供的答案对我有用。是否可以根据带宽对条目进行排序,带宽越高越好吗?
  • 可以使用外部排序或者使用TreeMap和带宽作为key
  • 如何使用 TreeMap 和带宽作为键来根据带宽对所有条目进行排序?你能提供一些代码吗?
  • 1) 创建TreeMap; 2) 遍历 HasMap 中的所有数据(值); 3)将值放入TreeMap,其中key是带宽和Signal的值实例;就这样
【解决方案2】:

让我猜猜,你的带宽保持为 0?那是因为你计算它的方式。我假设 getSize() 返回一个 int/long,而 totalSize 是一个 int/long。这将导致您的计算结果

(signal.getSize()/totalSize)*100

也是一个int。请尝试以下操作:

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

现在其中一个操作数是浮点数,是什么使计算结果也成为浮点数。希望这能解决您的问题。

另见here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2010-10-03
    • 2015-08-29
    • 2016-05-30
    相关资源
    最近更新 更多