【问题标题】:convert Object[] from a hashmap keyset to String[]?将 Object[] 从 hashmap 键集转换为 String[]?
【发布时间】:2013-04-15 18:13:02
【问题描述】:
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 += ";";
    }
}

请原谅我缺乏理解,但我正在尝试探索哈希图的用法。我知道 toArray() 返回一个 Object[]。但是,不能将其类型转换为 String[] 吗?正如您在代码中看到的,稍后,我需要遍历一个数组并进行一些拆分和其他字符串操作。

这样做我得到了一个错误:

java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]

非常感谢任何关于我应该如何解决这个问题的指导。谢谢!

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    您不能简单地将 Object[] 数组转换为 String[] 数组。您应该改用the generic version of toArray,这样会更好:

    String[] keyArray = keys.toArray(new String[keys.size()]);
    

    还请注意,您可以简单地迭代 entrySet(这将保存所有 get 调用)并使用 StringBuilder 以获得更好的字符串连接效率:

    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);
    

    【讨论】:

    • 感谢您的帮助!第一个使用 toArray 通用版本的解决方案对我来说已经足够好了,谢谢! =)
    • toArray(new String[0]) 版本绝对是要走的路。它简洁明了,准确地表达了您正在做的事情。
    • @NRitH 可能,但它创建了一个不必要的对象,所以我更喜欢“大小”版本。
    • @assylias IIRC,接受数组参数的 toArray() 版本只是使用参数来确定返回的类类型,因此您传入的数组的大小无关紧要。
    • @NRitH 并非如此。如果数组足够大,则使用它,否则创建一个新数组。它在 javadoc 中进行了解释:docs.oracle.com/javase/7/docs/api/java/util/… - 另请参阅:stackoverflow.com/questions/174093/…
    【解决方案2】:

    可以将 keyset 转换为 String[]。试试这个:

    String[] keys = map.keySet().toArray(new String[0]);
    

    【讨论】:

      【解决方案3】:

      您可以只遍历Set,我认为toArray 步骤是不必要的。像这样的:

      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 += ";";
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-07-16
        • 2014-07-20
        • 2022-11-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-08
        • 2017-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多