如何按属性对自定义对象的矢量进行排序,即其他自定义对象的地图?

时间:2016-11-06 21:17:21

标签: java sorting collections comparator comparable

层次结构如下:

  1. 类药物 - 它有药物名称和价格。

  2. 类别供应商 - 它拥有<Drug drug, int quantity>

  3. 的地图

    现在我有一个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)
    

1 个答案:

答案 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。

我建议您使用ListArrayList对,而不是Vector。{/ p>