【问题标题】:Printing HashMap values (those values are Arrays) error打印 HashMap 值(这些值是数组)错误
【发布时间】:2012-05-08 13:47:33
【问题描述】:

我已经尝试和寻找与我相似的问题将近 2 天,希望我能找到答案,但不,我不能,所以我决定在这里问你们。

这个方法是打印出HashMap<String, int[]>ratingmap的所有键和值。所以键是Strings,值是数组。我一直在努力,下面是我的代码。

public void showRatingsMap() {
    for (String customer: ratingmap.keySet()) {
        String key = customer.toString();
        int[] value = ratingmap.get(key);
        System.out.println("Customer: " + key + " - Rating: " + value);
    }
}

我现在真的很困惑,因为打印出来的结果是这样的:

Customer: Douglas Anderson - Rating: [I@4f5b571e
Customer: Sidney - Rating: [I@75b49b45
Customer: Apollo - Rating: [I@243e0b62
Customer: Leslie - Rating: [I@655d6184

正如我所期望的评级是一个数组,但它总是显示为上面的奇怪组合:[I@2b9fd66a

谁能指出导致问题的错误?

【问题讨论】:

标签: java arrays hashmap


【解决方案1】:

数组不会覆盖默认的toString() 方法。要打印其内容的表示,您可以使用Arrays.toString(int[])

查看我的回答here了解更多详情。

【讨论】:

  • 抱歉,我不太明白,请您说的更具体些。因为我刚刚开始使用 Java。我已经尝试过(对于我的代码):value.toString(int[] value),但它不起作用:)
  • @user1382202 在您的问题代码中使用Arrays.toString(value) 而不仅仅是value
  • 哦,我想通了,因为我没有导入java.util.Arrays; :) 谢谢 :)
【解决方案2】:

Value 是“int[]”,一个整数数组。但是,当您将该对象转换为字符串时,它不会自动为您打印数组的所有元素。它只打印数组在内存中的位置,这就是您所看到的。

您需要遍历数组的元素才能打印它们。像这样:

for (int v : value) {
    System.out.println(v);
}

或者,正如 Paul 所说(使用 Helper 类,如数组)

【讨论】:

    【解决方案3】:

    最简单的解决方案是使用HashMap<String, List<Integer>>,因为它会按照您的预期打印。

    【讨论】:

      【解决方案4】:

      您看到的是整数数组类型的内置toString 的结果——它打印“数组类型”[I 部分和“参考”部分,例如,@75b49b45,这在 per-同一个 JVM 中的实例基础。

      您需要手动迭代数组项并分别打印:

          int array[] = new int[] {3, 1, 4, 1};
          for (int i : array)
              System.out.print(i + " ");
          System.out.println();
      

      或者您可以将数组转换为List,它具有更友好的toString() 实现:

          int array[] = new int[] {3, 1, 4, 1};
          List<Integer> asList = new ArrayList<Integer>();
      
          for (int i : array)
              asList.add(i);
          System.out.println(asList);
      

      关于起点,有解释为什么你会看到[I——这是因为数组有内置的toString,它继承自toString()实现Object类,后者通过打印类的类型代码来工作它被调用,然后是@,然后是类实例的内部ID。整数数组的类型代码是[I

      查看 JDK 中 Class#getName() 的 javadoc 中可能的类型代码的完整描述。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多