【问题标题】:I don't understand output this code. (Map)我不明白输出这段代码。 (地图)
【发布时间】:2019-05-11 05:03:35
【问题描述】:

我不明白这个输出。

因为我创建了 4 个其他键(瓶 b1、b2、b3、b4)。

4 个键具有其他属性。

所以,我认为这段代码会打印 4 个输出。

但此代码仅打印 3 个输出。

为什么????

package map;

import java.util.Map;
import java.util.TreeMap;

public class TreeMapExample {
    public static void main(String[] args) {
        Bottle b1 = new Bottle("red", 15);
        Bottle b2 = new Bottle("black", 10);
        Bottle b3 = new Bottle("white", 20);
        Bottle b4 = new Bottle("green", 10);
//      Bottle b4 = new Bottle("red", 10);
//      Bottle b4 = new Bottle("red", 11);

        TreeMap<Bottle, Integer> treeMap = new TreeMap<Bottle, Integer>();
        treeMap.put(b1, 10);
        treeMap.put(b2, 15);
        treeMap.put(b3, 5);
        treeMap.put(b4, 20);

        for (Map.Entry<Bottle, Integer> entry : treeMap.entrySet()) {
            System.out.println(entry.getKey() + " - " + entry.getValue());
        }
    }
}

class Bottle implements Comparable<Bottle> {
    String name;
    int size;

    Bottle(String name, int size) {
        this.name = name;
        this.size = size;
    }

    @Override
    public int compareTo(Bottle o) {
        return this.size - o.size;
    }

    @Override
    public String toString(){
        return name + " bottle";
    }
}

如果Bottle b4 = new Bottle("green", 10);Bottle b4 = new Bottle("red", 10);

结果是

black bottle - 20
red bottle - 10
white bottle - 5

但如果Bottle b4 = new Bottle("red", 11);

结果是

black bottle - 15
red bottle - 20
red bottle - 10
white bottle - 5

我不明白这个输出...

【问题讨论】:

  • 这可能是因为你应该为你的 Bottle 类重写 equals 和 hashcode。
  • 但我认为哈希码,等于不需要。因为,Bottle 是(新对象)键。
  • Bottle 是 Key,Integer 值是 Value。我知道地图需要其他钥匙。而且我认为 b1、b2、b3、b4 不是同一个对象。

标签: java dictionary collections


【解决方案1】:

TreeMap 考虑了您在自定义比较器中使用的键的相等性。因为您的两个瓶子是相等的(因为它们具有相同的尺寸值),所以更换一个。在这种情况下:将绿色替换为黑色。

看看 treeMap.put 返回什么:

返回: 与 key 关联的前一个值,如果没有 key 映射,则返回 null。 (返回 null 也可以表明映射之前将 null 与 key 关联。)

https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html#put-K-V-

如果我们输出treeMap.put(...) 返回的内容,我们将看到我们得到四个nulls,在最后一种情况下,我们得到15。所以把 b4 替换为 b2 因为它们是相等的:

System.out.println(treeMap.put(b1, 10));
System.out.println(treeMap.put(b2, 15));
System.out.println(treeMap.put(b3, 5));
System.out.println(treeMap.put(b4, 20));

给予:

null
null
null
15

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2014-04-11
    • 1970-01-01
    • 2021-11-03
    • 2018-12-28
    相关资源
    最近更新 更多