19
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!

asked Apr 15, 2013 at 18:13

3 Answers 3

27

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);
answered Apr 15, 2013 at 18:16

7 Comments

Thanks for your help! The first solution with the generic version of toArray was good enough for me, thank you! =)
The toArray(new String[0]) version is definitely the way to go. It's concise and expresses exactly what you're doing.
@NRitH possibly but it creates an unnecessary object so I prefer the "sized" version.
@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.
@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/…
|
7

It is possible to cast keyset to String[]. Try this:

String[] keys = map.keySet().toArray(new String[0]);
answered Sep 19, 2013 at 21:29

Comments

2

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 += ";";
 }
}
answered Apr 15, 2013 at 18:18

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.