我有以下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>
地图的价值是药物的数量,我想通过它对所有供应商进行排序。
感谢您提前获得帮助,对不起,我很抱歉!
答案 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只储存了第一种药物。