2017-07-01 32 views
3

我必須執行方法maxPricePerProductType,它返回產品類型出價的最高價格,產品按字母順序排序。不考慮沒有出價的產品。該方法的原型爲:operations on sortedMap

public SortedMap<String, Integer> maxPricePerProductType() { //use toMap 

    return null; 
} 

我的班是

public class GroupHandling { 
    private Map<String, Group> groups = new HashMap<>(); 

    public SortedMap<String, Integer> maxPricePerProductType() { //use toMap 

     return null; 
     } 
} 

public class Group { 
    private String name; 
    String productType; 
    Map<String, Bid> bids = new HashMap<>(); 

    public String getProductType() { 
     return productType; 
    } 
} 
public class Bid { 
    String name; 
    Group g; 
    int price; 

    public int getPrice() { 
     return price; 
    } 

    public String getProductType(){ 
     return g.productType; 
    } 
} 

每個小組有興趣購買某種類型的產品,並在地圖bids註冊,該集團必須的選項購買產品。例如Group G1想要購買智能手機,他們有3個出價:B1,B2和B3。 B1費用10,B2 15和B3 7. G2也想購買智能手機。它有2個投標。 B4的成本爲5,B5的成本爲20.因此,我必須採用B1,B2,B3,B4和B5(因爲它們都是針對同一產品類型的所有出價),並添加到已排序的地圖B5中作爲關鍵字,並將其作爲值20。簡而言之,我需要從每個組中獲取出價,按產品類型對它們進行分組,並將最高價格的產品添加到已排序的地圖中。 這就是我試圖做的:

public SortedMap<String, Integer> maxPricePerProductType() { //use toMap 
    return groups.values().stream(). 
      flatMap(g -> g.bids.values().stream()) 
      . 
      ; 
} 

但我不知道該怎麼繼續,或者,如果這部分是正確的。

+4

這是一個有點不清楚。地圖中的字符串是什麼?組? (G1,G2等)出價? (B1,B2等)您如何知道這些出價來自同一組或同一產品?這只是首字母嗎?你說,「沒有出價的產品不被考慮。」他們是否完全缺席了地圖,或者表示爲映射爲null或零的字符串? –

+0

地圖的關鍵應該是什麼?產品類型或出價名稱?我問,因爲你說它應該是出價的名稱,但那麼你怎麼知道出價屬於哪種產品類型? –

+0

@DavidConrad不幸的是練習的內容有點不清楚。不過,我認爲產品類型與團隊是密切相關的,例如,如果只有一個團隊想要購買鞋子,而且它沒有任何出價,這意味着我不能考慮鞋子,並且他們不在地圖。地圖的關鍵是出價的名稱,正如我在下面寫的,價值是出價的價格 –

回答

3

這是誤導private Map<String, Gruppo> groups = new HashMap<>();Map<String, Bid> bids = new HashMap<>();舉行。如果這些地圖中的鍵是B1, B2...G1, G2... - 實際名稱,比你不需要它們 - 因爲無論如何這些信息都存在於它們中。所以這些應該是List s。

如果有別的東西,你可以使用:

SortedMap<String, Integer> result = groups 
      .values() 
      .stream() 
      .filter(g -> g.getBids() != null || !g.getBids().isEmpty()) 
      .flatMap(g -> g.getBids().values().stream()) 
      .collect(Collectors.groupingBy(b -> b.getGroup().getProductType(), 
        TreeMap::new, 
        Collectors.mapping(Bid::getPrice, 
          Collectors.collectingAndThen(Collectors.maxBy(Comparator.naturalOrder()), Optional::get)))); 
相關問題