2015-08-19 21 views
5

Biorąc pod uwagę kolekcję pary {Price, Quantity}, muszę zebrać wszystkie ilości w tym samym przedziale cenowym. Jaki jest najłatwiejszy sposób, aby to osiągnąć?Pływak jako klucz na mapie

Drobno krojone, byłoby wdrożenie rozwiązania przy użyciu Hashmap z kluczami będącymi ceną i wartością będącymi sumą zagregowaną. Ale według mojej wiedzy, Float nie jest bezpiecznym kluczem dla Hashmap. To rozwiązanie jest podatne na błędy.

Co jest zalecanym rozwiązaniem alternatywnym, aby rozwiązać ten problem?

+4

Użyj więc ciągu jako klucza. Jaki jest problem? –

+3

Zdefiniuj "punkt ceny?" Czy cena jest w pewnym zakresie? Możesz utworzyć nową klasę, taką, która zawiera wartość ceny (ja sam użyłbym w tym celu BigDecimal), a to przekłada cenę na zakres, przy czym zakres jest używany do określenia parametru hashCode. –

+1

Doskonały. Dzięki!! Byłem zbyt pochłonięty problemem, aby myśleć o tym prostym rozwiązaniu. Dzięki @AleksandrM –

Odpowiedz

8

Możesz użyć BigDecimal jako klucza. Byłby bezpieczny dla kodu.

Trzeba by zainicjować wartości więc mają tę samą skalę, na przykład:

BigDecimal key = new BigDecimal(Double.toString(price)).setScale(2); 
+0

@downvoter, -1, jakikolwiek powód ??? –

+1

BigDecimal również ma precyzję i zdecydowanie powinien być stosowany do finansowych punktów stałych. Pomimo, że jest pełen gadaniny i wymaga opieki. –

0

Jeśli wszystkie ceny stały rozmiar dziesiętny (2 cyfry na przykład), można po prostu wykorzystać Long, prezentując cena w centach, jako klucz mapy.

Korzystanie BigDecimal jest złym rozwiązaniem, ponieważ może to prowadzić do rzadkich i trudno odkryć błędy - dwa BigDecimal y są równe tylko wtedy, gdy mają taką samą wartość i taką samą dokładnością (w ten sposób 2.0 nie jest równa 2.00 ani 2 - wszystkie trzy staną się różnymi kluczami na mapie).