打印HashMap值(这些值是数组),出现错误。

3

我已经试图寻找与我的类似的问题将近2天了,希望能找到答案,但没能找到,于是我决定在这里向你们提问。

该方法是打印出一个 HashMap<String, int[]> ratingmap 中的所有键和值。所以键是字符串,值是数组。我一直在研究这个问题,下面是我的代码。

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中打印数组的最简单方法的重复问题。 - assylias
那些“奇怪的组合”是对象引用。评分映射中存储了哪种类型的对象? - DrewCo
4个回答

6

抱歉,我真的不太明白,请您能否更具体一些。因为我刚开始学习Java。我已经尝试过(对于我的代码):value.toString(int[] value),但它不起作用 :) - user1382202
1
@user1382202 在你的问题代码中使用Arrays.toString(value)而不是仅仅使用value - assylias
噢,我明白了,因为我没有导入java.util.Arrays; :) 谢谢 :) - user1382202

2

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

您需要遍历数组元素才能将它们打印出来,像这样:

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

或者,正如Paul所说(使用一个帮助类,比如Arrays)。

1

最简单的解决方案是使用 HashMap<String,List<Integer>>,因为这样打印出来的结果会和您期望的一样。


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 方法,该方法继承自 Object 类的 toString() 实现,而后者通过打印调用它的类的类型代码,然后是 @,最后是该类实例的内部 ID。整数数组的类型代码是 [I

在 JDK 的 javadoc 中可以查看到可能的类型代码的完整描述,请参见 Class#getName()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接