层次结构如下:
类药物 - 它有药物名称和价格。
类别供应商 - 它拥有<Drug drug, int quantity>
。
现在我有一个Vector<Suppliers>
(持有,比方说5个供应商),我想按用户输入的药品名称数量的降序排序。
这甚至可能吗?我尝试过使用比较器,但我无法使用它。
好的,我尝试做的只是将那些已作为参数药物传递的供应商放入新的List
中,然后在列表中执行排序。我认为这是一个很好的解决方法,但后来我需要以某种方式改变'排序'。
这是我迭代所有供应商并检查他们是否有药物的方法,如果他们这样做 - >将它们添加到新列表中并尝试最终对其进行排序。
public List<Supplier> getSortedSuppliersByQuantity(Drug drug) {
List <Supplier> sortedSuppliers = new ArrayList <Supplier>();
for(Supplier s : suppliers) {
for(Entry<Drug, Integer> entry : s.getListOfDrugs().entrySet()) {
if(entry.getKey().getDrugsName().equals(drug.getDrugsName()));
sortedSuppliers.add(s);
}
}
sort(drug, sortedSuppliers);
return sortedSuppliers;
}
问题是我在NullPointerException
行获得sort
。
我认为您建议的sort
方法需要更改为以某种方式处理新列表而不是旧列表?
@Andrew的Stacktrace
Exception in thread "main" java.lang.NullPointerException
at java.util.Objects.requireNonNull(Unknown Source)
at java.util.Optional.<init>(Unknown Source)
at java.util.Optional.of(Unknown Source)
at myapp.Supplier.getKeyExtractor(Supplier.java:22)
at myapp.Orders.lambda$0(Orders.java:89)
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:89)
at myapp.Orders.getSortedSuppliersByQuantity(Orders.java:106)
at myapp.main.main(main.java:22)
答案 0 :(得分:2)
以下比较器执行与您相同的操作,但采用较短的Java 8格式:
public void sort(Drug drug, Vector<Supplier> suppliers) {
Collections.sort(suppliers, Comparator.comparing(s -> s.getDrugs().get(drug)));
}
当地图不包含给定的拖拽或供应商没有交易药物(NullPointerException
)时,问题就出现了。
如何解决?添加null
检查或将有效参数传递给方法。
编辑:
我编写了getKeyExtractor
方法,它会抛出一个带有详细消息的异常(如果发生了不好的事情),以了解发生了什么:
public void sort(Drug drug, Vector<Supplier> suppliers) {
Collections.sort(suppliers, Comparator.comparing(s -> Supplier.getKeyExtractor(s, drug)));
}
public static Integer getKeyExtractor(Supplier supplier, Drug drug) {
return Optional.ofNullable(Optional.ofNullable(supplier.getDrugs())
.orElseThrow(() -> new IllegalArgumentException("drugs is null")).get(drug))
.orElseThrow(() -> new IllegalArgumentException("the drug couldn't be found"));
}
P.S。
我建议您使用List
与ArrayList
对,而不是Vector
。{/ p>