我使用的是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作为地图中每个键的键,我得到它的值 尝试设置带宽属性,然后将其写入文件,但不会更新带宽。
我该怎么办?我是唯一一个选择删除条目并在迭代时添加另一个新值的选项吗?
提前致谢
答案 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
内容