打印HashMap值(这些值是数组)错误

时间:2012-05-08 13:47:34

标签: java arrays hashmap

我一直在努力寻找与我相似的问题将近2天希望我能找到答案,但不,我不能这样,我决定在这里问你们。

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

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

有人可以指出导致问题的错误吗?

4 个答案:

答案 0 :(得分:6)

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

有关详细信息,请参阅我的回答here

答案 1 :(得分:2)

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

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

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

或者,正如保罗所说(使用辅助类,如阵列)

答案 2 :(得分:1)

你看到的是整数数组类型内置toString的结果 - 它打印“数组类型”[I部分和“引用”部分,例如@75b49b45 ,在同一个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中可能的类型代码的完整描述。

答案 3 :(得分:1)

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