【问题标题】:How do I return an array that's being stored as a value in a HashMap [closed]如何返回作为值存储在 HashMap 中的数组 [关闭]
【发布时间】:2020-10-26 20:43:58
【问题描述】:

我正在尝试在哈希映射中存储一个数组,这样哈希映射也是另一个哈希映射的子节点。

直观地表达我的意思:

parentHashMap <"myParentKey":childHashMap>
---childHashMap <"properties":myArray[]>
------myArray = ["value 1", "value 2", "etc"]

我之所以让这种存储解决方案令人眼花缭乱,是因为我希望我的 childHashMap 对 parentHashMap 中的每个键都有不同的“属性”值。

myArray 不一定是 all 我要存储的属性,而是一个可以保存多个值的属性(即 )

最终,我将如何返回 myArray 以便显示其内容?此外,我们将非常感谢您提出更好地格式化我的存储解决方案的建议,而不是嵌套地图。

【问题讨论】:

  • 你能举个例子吗?因为这对你最后提到的字符串还不清楚。请编辑您的帖子并添加示例
  • 您的问题似乎简化为“我怎样才能漂亮地打印数组的内容”。关于您的 HashMap 和键等的所有其他内容似乎都无关紧要。请阅读How to Ask 了解如何提出一个好问题的概述。然后可以按照我的建议制定这个问题,并且可能已经有关于 SO 的答案。
  • 这能回答你的问题吗? What's the simplest way to print a Java array?
  • 不完全。我将尝试重新表述我的问题以更清楚。

标签: java arrays hashmap return output


【解决方案1】:

如果我理解您的问题,例如您将 String[] 的实例放入地图中,那么:
您必须将其转换回这种类型。可以这样做:

HashMap<String, Object> properties = new HashMap<>();
Object array = properties.get("Key_To_Array");
if (array instanceof String[]) {
  String[] arrayElementsAsString = (String[]) array;
  // Do something with Strings in array.
}

【讨论】:

    【解决方案2】:

    你不能“解析”一个数组,你只能解析字符串。

    假设您确定键 hello 将映射到一个 int 数组,那么:

    int[] v = (int[]) properties.get("hello");
    System.out.println("The second value is: " + v[1]);
    

    如果你不知道,你可以随时这样做:

    Object o = properties.get("hello");
    if (o.getClass().isArray()) {
        // we get here if o is an array.
        // (and a NullPointerException if 'hello' is unmapped.
    
        Object secondValue = java.lang.reflect.Array.get(o, 1);
    }
    

    不过,总的来说,您的设计很糟糕。地图中的异构存储听起来像是您非常非常糟糕地重新发明了类型化对象的概念。只需创建一个类,每个“属性”都有一个字段。如果这些数据来自其他一些不是特别静态/名义类型的系统(例如,通过 Web API 的一堆 JSON),那么使用擅长处理它的工具。例如,对于 JSON,您可以使用 jackson 或 gson。

    【讨论】:

    • 我考虑过这样做,但不太确定如何去做。我之所以使用数组,是因为我有一个可以存储多个值的键值。作为一个通用示例,假设我有一个名为“genresOfMusic”的键,它的值将存储不同类型的列表(即摇滚、乡村、爵士、R&B 等),我可以使用类来做到这一点吗?跨度>
    • 当然...class Song { private final List&lt;Genre&gt; genres; }Genre 大概类似于enum Genre { ROCK, POP, /* etcetera */; },或者只是List&lt;String&gt; genres,如果你只是想要免费的字符串。 Java 是一种名义上的类型化语言。制作类型并给它们起好名字,那么java就可以很好地工作。
    【解决方案3】:
    public static void main(String... args) {
        Map<String, Object> properties = new HashMap<>();
        properties.put("one", new int[] { 1, 2, 3 });
        properties.put("two", new String[] { "4", "5", "6" });
    
        properties.forEach((key, val) -> {
            if (val == null)
                System.out.format("key: %s is null\n", key);
            else if (val.getClass().isArray()) {
                String[] arr = new String[Array.getLength(val)];
    
                for (int i = 0; i < arr.length; i++)
                    arr[i] = String.valueOf(Array.get(val, i));
    
                System.out.format("key: %s is an array: %s\n", key, Arrays.toString(arr));
            } else
                System.out.format("key: %s is not an array: %s\n", key, val);
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      相关资源
      最近更新 更多