convert Object[] from a hashmap keyset to String[]?
Solution 1
You can't simply cast an Object[]
array to a String[]
array. You should instead use the generic version of toArray
, which should work better:
String[] keyArray = keys.toArray(new String[keys.size()]);
Also note that you could simply iterate over the entrySet
(that will save all the get
calls) and use a StringBuilder for better string concatenation efficiency:
StringBuilder hashmapDetails = new StringBuilder();
for(Map.Entry<String, String> e : mappings.entrySet()) {
String[] details = e.getKey().split("/");
hashmapDetails += details[1];
hashmapDetails += e.getValue();
hashmapDetails += ";";
}
String result = hashmapDetails.substring(0, hashmapDetails.length() - 1);
Solution 2
It is possible to cast keyset to String[]. Try this:
String[] keys = map.keySet().toArray(new String[0]);
Solution 3
You could just iterate through the Set
, I don't think the toArray
step is necessary. Something like this:
Set<String> keys = mappings.keySet();
String hashmapDetails = "";
for(String key : keys){
String[] details = key.split("/");
hashmapDetails += details[1];
hashmapDetails += mappings.get(key);
if (p != keys.size() -1){
hashmapDetails += ";";
}
}
lyk
Updated on July 05, 2022Comments
-
lyk almost 2 years
Set<String> keys = mappings.keySet(); String[] keyArray = (String[]) keys.toArray(); String hashmapDetails = ""; for(int p=0; p < keyArray.length; p++){ String[] details = keyArray[p].split("/"); hashmapDetails += details[1]; hashmapDetails += mappings.get(keyArray[p]); if (p != keyArray.length -1){ hashmapDetails += ";"; } }
Pardon my lack of understanding but I'm trying to explore the usage of hashmaps. I understand that the toArray() returns an Object[]. However, is it not possible to type cast it to a String[]? As you can see in the codes, later, I need to go through an array and do some splitting and other String manipulation.
By doing this I got an error:
java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]
Any guidance on how I should tackle this is greatly appreciated. Thanks!
-
lyk about 11 yearsThanks for your help! The first solution with the generic version of toArray was good enough for me, thank you! =)
-
NRitH almost 11 yearsThe
toArray(new String[0])
version is definitely the way to go. It's concise and expresses exactly what you're doing. -
assylias almost 11 years@NRitH possibly but it creates an unnecessary object so I prefer the "sized" version.
-
NRitH almost 11 years@assylias IIRC, the version of toArray() that takes an array argument just uses the argument to determine the returned class type, so the size of the array you pass in is immaterial.
-
assylias almost 11 years@NRitH that is not the case. If the array is big enough, it is used, otherwise a new array is created. It is explained in the javadoc: docs.oracle.com/javase/7/docs/api/java/util/… - see also: stackoverflow.com/questions/174093/…
-
NRitH almost 11 years@assylias Interesting. I wonder whether that's new, because I don't remember the Javadoc saying that previously.
-
assylias almost 11 years@NRitH it has been the case since at least Java 4, documented in the parameters section: docs.oracle.com/javase/1.4.2/docs/api/java/util/…