2016-11-06 69 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