gpt4 book ai didi

java - 按 Map 的值对 列表进行排序会导致具有不同私有(private)字段的对象崩溃
转载 作者:行者123 更新时间:2023-12-01 09:16:46 25 4
gpt4 key购买 nike

我有以下类型的对象列表 Supplier 。每个对象都有一个私有(private)Map <Drug, Integer> (每种药物都有价格和名称),我正在按 map 值成功对它们进行排序。但是,当我尝试对列表进行排序时(如果有 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姓名 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 map 值,针对不同Drugs价格。例子: Supplier1 <new Drug(drug1, 7.66), 50> Supplier2 <new Drug(drug1, 6.72), 30> Supplier3 <new Drug(drug1, 8.94), 15> map 的值是药品的数量,我想按它对所有供应商进行排序。感谢您提前提供的帮助,对于这么长的帖子我深表歉意!

最佳答案

在 Orders.sort() 中填充 bufferList 时,您仅检查 Drug.name,而不检查价格。在这种情况下,您会在列表中找到一个供应商,以对不包含该药品的供应商进行排序。

关于java - 按 Map <Object b, Integer int> 的值对 <Object a> 列表进行排序会导致具有不同私有(private)字段的对象崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40496845/

25 4 0