2013-09-24 5 views
2

Я использую HashMap, где ключ String и Value является объектом (Signal). Итерация по карте Можно ли изменить один из атрибутов моего объекта, прежде чем я напишу его в файл.Атрибут обновления объекта во время итерации по HashMap

Вот мой код

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 в качестве ключа для каждого ключа в карте я получаю его значение Попробуйте установить атрибут полосы пропускания, а затем записать его в файл, но он не обновляет полосу пропускания.

Как это сделать? Единственный вариант, с которым я остаюсь, чтобы удалить запись и добавить другую с новым значением во время итерации?

Заранее спасибо

+1

Где код класса и методов сигнала установить и получить для полосы пропускания? –

+0

позвольте мне также указать – Wearybands

+1

Просьба представить декларацию 'totalSize'. Если оно имеет значение 100, то полоса будет оставаться как 'signal.getSize()'. Просто чтобы проверить. – idiazt

ответ

2

Позвольте мне угадать, ваша пропускная способность остается 0? Это из-за того, как вы его вычисляете. Я предполагаю, что getSize() возвращает int/long, а totalSize - int/long. Результатом является результат вашего расчета.

(signal.getSize()/totalSize)*100 

является также и int. Попробуйте следующее:

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

Теперь один из операндов с плавающей точкой, что делает результат вычисления с плавающей точкой, а также. Надеюсь, это решит вашу проблему.

См. Также here.

+0

Спасибо, что это сработало ... Мой плохой ... – Wearybands

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 InstEd из keySet + get

+0

Ответ, предоставленный salsolatragus, работал для меня. Возможно ли, что я отсортирую свои записи по полосе пропускания, чем выше пропускная способность, тем лучше? – Wearybands

+0

Возможно использование внешней сортировки или использование TreeMap и пропускной способности в качестве ключа –

+0

Как я могу использовать TreeMap и ширину полосы пропускания в качестве ключа для сортировки всех моих записей по полосе пропускания? Можете ли вы указать код? – Wearybands

Смежные вопросы