2016-11-06 73 views
2

层次结构是这样:如何按属性排序自定义对象的矢量,即其他自定义对象的地图?

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

  2. 类供应商 - 它拥有一个地图<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; 
} 

问题是,我得到了NullPointerExceptionsort线。

我认为sort方法,你建议,需要改变,以某种方式行事新的列表,而不是旧的?

堆栈跟踪为@Andrew

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) 
+3

你为什么使用'Vector <>'? – Andrew

+0

你的'Comparator'在哪里? –

+0

实际上没有一般用途,我只是认为它能很好地适应我。这是错的吗? – Calihog

回答

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")); 
} 

PS

我建议您在这里使用ListArrayList配对,而不是Vector

+0

谢谢你的时间!如何以及在哪里需要添加这些'空'检查,我不明白?我从我的'main'调用'sort'方法,传递一种有效的药物,所有供应商都有库存,但我仍然得到'NullPointerException'。 :( – Calihog

+0

@Calihog,请提供完整的堆栈跟踪和发生异常的地方 – Andrew

+0

@Calihog听起来像你的地图查找失败,你需要弄清楚为什么,并决定要做什么 – shmosel

相关问题