I have a <p:dataTable>
where each row has an inputText like this:
<p:dataTable ... rowIndexVar="row">
<p:column>
<p:inputText value="#{myBean.items[row + 1]}" />
</p:column>
</p:dataTable>
The items
property is a Map<Long, String>
:
private Map<Long, String> items = new HashMap<Long, String>();
When I submit some data and manually iterate over the map, it apparently works:
Iterator itr = items.entrySet().iterator();
while (itr.hasNext()) {
Map.Entry e = (Map.Entry) itr.next();
System.out.println("key: " + e.getKey() + " " + "value: " + e.getValue());
}
I get:
key: 1 value: item1 key: 2 value: item2 key: 3 value: item3 key: 4 value: item4
However, when I try to get a specific item by key
String item = items.get(1);
then I get a null
. Based on the map's contents I should get item1
. How is this caused and how can I solve it?
util. HashMap. get() method of HashMap class is used to retrieve or fetch the value mapped by a particular key mentioned in the parameter. It returns NULL when the map contains no such mapping for the key.
String is as a key of the HashMap When you create a HashMap object and try to store a key-value pair in it, while storing, a hash code of the given key is calculated and its value is placed at the position represented by the resultant hash code of the key.
For this, just declare HashMap as HashMap<"datatype of key","datatype of value" hs = new HashMap<>(); Using this will make your code cleaner and also you don't have to convert the result of hs. get("my_code") to string as by default it returns value of string if at entry time one has kept value as a string.
Get keys from value in HashMap To find all the keys that map to a certain value, we can loop the entrySet() and Objects. equals to compare the value and get the key. The common mistake is use the entry. getValue().
The 1
which you specified in items.get(1)
is specified as an int
and autoboxed to Integer
. This doesn't equals()
a Long
value of 1
and hence the key is never found.
Integer int1 = new Integer(1);
Long long1 = new Long(1L);
System.out.println(int1.equals(long1)); // false
You need to specify the 1
as Long
instead of (implicitly) as Integer
.
String item = items.get(1L);
In case you wonders why you didn't got a compilation error here, it's because Map#get()
takes an Object
instead of K
for the reasons mentioned here: What are the reasons why Map.get(Object key) is not (fully) generic.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With