使用关键方法查找地图,设法在地图中找到关键字。怎么样?

时间:2017-09-07 02:22:06

标签: java maps equality treemap

我有这张地图

    private final Map<StockItem, Integer> list;

我正在使用一种方法通过生成一个返回StockItem类型的键来查找此映射中的值。

这是方法

    public static StockItem MakeKey(String name, double price, int quantityStock){
    return new StockItem(name,price,quantityStock);
}

代码工作正常,查找工作正常,我的问题是这是如何发生的?因为make Key方法返回一个全新的对象,该对象包含可能包含在列表中的完全相同的数据。它会经历每次迭代然后调用.equals来比较每个对象吗?

这里是StockItem类,我使用的是TreeMap

public class StockItem implements Comparable<StockItem> {
private final String name;
private int quantity;
private double price;
private int reserveItems = 0;

public StockItem(String name, double price) {
    this.name = name;
    this.price = price;
    quantity = 0;
}

public StockItem(String name, double price, int quantityStock) {
    this.name = name;
    this.price = price;
    quantity = quantityStock;

}

public void reserveItem(int amountReserved){
    this.reserveItems = amountReserved + this.reserveItems;
}

public void unReserveItem(int unreserve){
    reserveItems = reserveItems - unreserve;
}

public int getReservedAmount(){
    return reserveItems;
}

public String getName() {
    return name;
}

public int quantityInStock() {
    return quantity;
}

public double getPrice() {
    return price;
}

public void adjustStock(int quantity) {
    this.quantity = this.quantity + quantity - this.reserveItems;
}

public final void setPrice(double price) {
    if (price > 0.0)
    this.price = price;
}

public static StockItem MakeKey(String name, double price, int quantityStock){
    return new StockItem(name,price,quantityStock);
}
@Override
public int compareTo(StockItem o) {
    if (this == o){
        return 0;
    }

    if (o != null){
        return this.name.compareTo(o.getName());
    }

    throw new NullPointerException();
}


public String toString(){
    return "Item Name: " + this.name + " Item Price: " + this.price;
}

}

任何帮助都会非常感谢你。

1 个答案:

答案 0 :(得分:0)

没有 TreeMapComparator(例如在您的示例中)根据其对象的 compareTo 方法是否认为项目相等来进行查找:

<块引用>

排序映射使用其compareTo(或compare)方法执行所有键比较,因此从排序映射的角度来看,此方法认为相等的两个键是相等的。< /p>

由于 StockItemcompareToname 值相等时返回 true,并且由于“key”项包含 name 值,因此按键查找地图返回相应的项目,因为“关键”对象被地图认为等于整个对象。

关于它如何工作以及它是否遍历每个对象的问题的答案可以从 TreeMapJavadocs 中确定:

<块引用>

基于红黑树的 NavigableMap 实现。 [...] 此实现为 containsKeygetputremove 操作提供有保证的 log(n) 时间成本。算法改编自 Cormen、Leiserson 和 Rivest 的算法简介

如前所述,查找是使用 red–black tree 执行的。其工作原理的细节超出了本答案合理适合的范围。然而,get 方法被定义为 log(n) time cost 的事实告诉我们,它不会迭代列表中的所有元素,因为对所有元素的迭代将是一个更昂贵的 n时间成本。