Я не понимаю вывод этого кода.(Карта) - PullRequest
1 голос
/ 11 мая 2019

Я не понимаю этот вывод.

, потому что я создал 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

Я не понимаю этот вывод ...

1 Ответ

1 голос
/ 11 мая 2019

TreeMap учитывает равенство ключей, которые вы использовали в пользовательском компараторе. Поскольку две ваши бутылки равны (потому что они имеют одинаковое значение размера), одна заменяется. В этом случае: зеленый заменяется черным.

Посмотрите, что возвращает treeMap.put:

Возвращает: предыдущее значение, связанное с ключом, или ноль, если не было сопоставления для ключа. (Нулевой возврат также может указывать, что карта ранее ассоциировала нуль с ключом.)

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
...