通过它的Map <object b,=“”integer =“”int =“”>的值对<object a =“”>的列表进行排序会导致具有不同私有字段的对象崩溃

时间:2016-11-08 21:36:24

标签: java sorting

我有以下Supplier类型的对象列表。每个对象都有一个私有地图<Drug, Integer>(每个药物都有价格和名称),我正在通过地图值成功地对它们进行排序。但是,当我尝试对列表进行排序时,如果Drugs具有不同的价格,我会崩溃。我很确定这是我在这里失踪的非常小的东西,但我已经碰到了这里。 这是我的Supplier课程:

public class Supplier  {
    private String supplierName = "";
    private String representative = "";
    private String representativesPhoneNumber = "";

    private Map<Drug, Integer> listOfDrugs = new HashMap<Drug, Integer>();

    Supplier(String n, String rep, String repPhoneNum, String drugName, double drugPrice, int stock) {
        this.supplierName = n;
        this.representative = rep;
        this.representativesPhoneNumber = repPhoneNum;
        listOfDrugs.put(new Drug(drugName, drugPrice), stock);
    }

    public Map<Drug, Integer> getListOfDrugs() {
        return this.listOfDrugs;
    }

    public static Integer getKeyExtractor(Supplier supplier, Drug drug) {
        return Optional.ofNullable(Optional.ofNullable(supplier.getListOfDrugs())
                                   .orElseThrow(() -> new IllegalArgumentException("drugs is null")).get(drug))
                       .orElseThrow(() -> new IllegalArgumentException("the drug couldn't be found"));
    }

public int getDrugsStock(String drugsName) {
    for (Entry<Drug, Integer> entry : listOfDrugs.entrySet())
    {
        if(entry.getKey().getDrugsName().equalsIgnoreCase(drugsName)) {
            return listOfDrugs.get(entry.getKey());
        }
    }
    return 0;
}

}

如果对象Map,它有一个<Drug, Integer>。 这是我的Drug课程:

public class Drug {
    private String name = "";
    private double price = 0.0;

    Drug(String n, double p) {
        this.name = n;
        this.price = p;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        long temp;
        temp = Double.doubleToLongBits(price);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Drug other = (Drug) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (Double.doubleToLongBits(price) != Double.doubleToLongBits(other.price))
            return false;
        return true;
    }
}

为了垃圾邮件,大多数代码都会被修剪。 :)

我的Orders课程,我实际上在那里进行排序:

public class Orders {
    private Map <Drug, Integer> orderedDrugs = new HashMap <Drug, Integer>();
    private Vector<Supplier> suppliers = new Vector <Supplier>();   

        public List<Supplier> sort(Drug drug, List<Supplier> suppliers) {
    List<Supplier> bufferList = new ArrayList <Supplier>();
    for (Supplier s : suppliers) {
        if(s.getDrugsStock(drug.getDrugsName()) != 0) {
            bufferList.add(s);
        }
    }
    Collections.sort(bufferList, Comparator.comparing(s -> Supplier.getKeyExtractor(s, drug)));
    Collections.reverse(bufferList);
    return bufferList;
}
}

再次修剪代码,仅显示实际问题所需的方法。

以下是我main的一个示例:

            Drug drug = new Drug("product1", 27.6);
            for(Supplier s : orders.sort(drug, orders.getSupplierList())) {
                System.out.println(s);
            }

所以在这里,如果我有2个Suppliers,并且他们都有名为Drugs的{​​{1}},但价格不同,我会遇到以下崩溃:

product1

我希望根据xception in thread "main" java.lang.IllegalArgumentException: the drug couldn't be found at myapp.Supplier.lambda$1(Supplier.java:72) at java.util.Optional.orElseThrow(Unknown Source) at myapp.Supplier.getKeyExtractor(Supplier.java:72) at myapp.Orders.lambda$0(Orders.java:97) at java.util.Comparator.lambda$comparing$77a9974f$1(Unknown Source) at java.util.TimSort.countRunAndMakeAscending(Unknown Source) at java.util.TimSort.sort(Unknown Source) at java.util.Arrays.sort(Unknown Source) at java.util.ArrayList.sort(Unknown Source) at java.util.Collections.sort(Unknown Source) at myapp.Orders.sort(Orders.java:97) at myapp.main.main(main.java:77) 地图值对<Suppliers>的列表进行排序,以获得不同的Suppliers价格。 例: Drugs Supplier1 <new Drug(drug1, 7.66), 50> Supplier2 <new Drug(drug1, 6.72), 30> 地图的价值是药物的数量,我想通过它对所有供应商进行排序。 感谢您提前获得帮助,对不起,我很抱歉!

2 个答案:

答案 0 :(得分:1)

在Orders.sort()中填充bufferList期间,您只检查Drug.name而不是价格。在这种情况下,您会在列表中找到一个供应商,以排除不能持有药物的供应商。

答案 1 :(得分:0)

您有多个具有相同名称的药物。

假设供应商1销售名为&#34; Tylenol&#34;供应商2还出售一种叫做“泰诺”的药物。但这些都是单独的药物。

然后你创建了一个名为&#34; Tylenol&#34;的第三种药物,但当你打电话给supplier1.getDrugsStock("Tylenol")时,它会返回第一种药物,当你拨打supplier2.getDrugsStock("Tylenol")时,它会返回第二种药物,所以你将这两个供应商添加到bufferList

然后你致电supplier1.getDrugsStock().get(thirdDrug)并返回null,因为supplier1只储存了第一种药物。