2013-05-17 1 views
0

У меня есть карта, какНе удается получить значение карты <BigDecimal, String> ключа

Map<BigDecimal, String> functions = new HashMap<BigDecimal, String>(); 

При попытке доступа к значению карты со страницы JSF, он ничего не отображает. Я проверил размер карты, и он возвращает число, оно кажется пустым. Вот код страницы JSF

<p:dataTable value="#{bean.permissions}" var="permission"> 
    <p:column> 
     #{bean.functions[permission.functionId]} 
    </p:column>      
</p:dataTable> 

Как это вызвано и как я могу его решить?

+0

Спасибо Balusc и mendoza – Malcolmxappa

+0

Ответ Димы не должен приниматься. Его ответ совершенно ошибочен и вводит в заблуждение. Чтобы получить правильный ответ, вы должны предоставить SSCCE. Скорее всего, причина в том, что вы использовали ключ неправильного типа. – BalusC

ответ

-7

BigDecimal плохой ключ для HashMap, он использует адрес BigDecimals памяти в качестве ключа, так что даже если у вас есть 2 одинаковые значения, его другой ключ, попробуйте использовать toString() в BigDecimal в качестве ключевого

+0

Я изменил карту на это и набрал ключевую часть карты с помощью ** BigInteger.toString() ** 'Карта functionMap = new HashMap ();' И попробуйте присоединяется к карте с страницы JSF следующим образом: '# {mybean.functionMap [permission.functionId.toString()]}' 'permission' - это объект, который повторяется в datatable. – Malcolmxappa

+1

Этот ответ - полная бессмыслица. 'BigDecimal' имеет [отлично отлично] (http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#equals (java.lang.Object))' equals() '(и' hashCode() '). User2262540: Другими словами, вы фактически использовали 'BigInteger', а не' BigDecimal'? Таким образом, вы на самом деле пытались использовать ключ «BigInteger» на карте, где «BigDecimal» используется как ключ? – BalusC

+0

Вы знаете, что у многих объектов есть эта проблема, поэтому всегда лучше делать toString – Dima

3

Два BigDecimals не равны, если их масштабы не равны, даже если они представляют одно и то же числовое значение. Вот почему они не могут создавать хорошие карты.

Для двух BigDecimals, представляющих одинаковые значения с разными шкалами, compareTo() вернет 0, но equals() вернет false.