2013-08-22 44 views
3

我有下面的地圖,我想分費率與收費地圖中的每個值,而無需迭代每個條目和構建新的map.Is它可能嗎?HashMap值計算沒有迭代

final String rate="2"; 
Map<String,BigDecimal> charges=new HashMap<String,BigDecimal>(); 
charges.put("tax", new BigDecimal(22)); 
charges.put("vat", new BigDecimal(200)); 
charges.put("gross", new BigDecimal(100)); 
charges.put("principal", new BigDecimal(150)); 

分裂後

charges.put("tax", new BigDecimal(11)); 
charges.put("vat", new BigDecimal(100)); 
charges.put("gross", new BigDecimal(50)); 
charges.put("principal", new BigDecimal(75)); 

回答

3

BigDecimal是不可變的,所以你必須用新的實例替換地圖中的值。你並不需要建立一個新的地圖,但是,(但你需要遍歷):

final BigDecimal divisor = new BigDecimal(rate); 

for (Entry<?, BigDecimal> e : charges.entrySet()) { 
    e.setValue(e.getValue().divide(divisor)); 
} 

雖然我懷疑@JonSkeet是關於使用地圖的正確;一個包含與你的地圖的鍵相對應的字段的類在這裏似乎更合適。

+0

它是給出錯誤,如果速率是有點像「0.1111111111」。然後我使用RoundingMode.HALF_UP,但它不是如果有的話給出整個值。像100.00,.00這裏不需要 – user2684215

+0

@ user2684215它是否產生錯誤或產生意想不到的結果?這兩個不相同。 – arshajii

+0

冷杉的東西,它給運行時錯誤 – user2684215

7

這可能嗎?

不可以。另外,您一開始就不應該使用地圖。你幾乎肯定會有更好的Charge類型與適當的領域。 (這可能是4個字段,或者也許你可以計算其他值的一些值。)

然後,您可以添加一個方法,以將所有相關字段值除以常量,或者(更好的IMO)返回新的具有新值的類型實例(使Charge類型本身不可變)。

+0

這裏收費是多少?請給我詳細的具體說明。謝謝,我不明白。我不知道確切的字段,直到運行時間 – user2684215

+0

@ user2684215:收費將是你自己的類型來封裝數據。爲什麼只有在執行時才知道這些字段? (在你的示例代碼中顯然不是這種情況,如果你的示例代碼不能代表現實,那麼它並不是非常有用)。 –

+0

計算完這張地圖後,我必須通過迭代每個條目來準備查詢。我不使用這張地圖來移動到系統。所以如果我使用一些第三方api將hashmap轉換爲pojo或者構建我自己的,我會得到什麼好處。 – user2684215