提供此供应链问题的递归解决方案

时间:2019-05-09 06:44:28

标签: java database algorithm recursion data-structures

假设我有两个具有以下结构的表Agreement和Orders。

协议表

Product_ID  Seller  next_Supplier  SellingPrice
   1001        M       s1            90                                 
   1001       s1       s2            100
   1001       s1       s3            105
   1001       s1       s4            125
   1001       s2       s21           110
   1001       s3       s31           120
   1001       s4       s41           150

将其视为一个供应链问题,其中每个级别都有多个供应商,供应商将从制造商M处获取一个,并达成协议将产品提供给下一个级别的供应商。协议表包含各个供应商之间的协议,例如s1达成了以$ 100.s2的价格向s2提供产品的协议(s1的下一级供应商)达成了以$ 110.s1的价格将产品提供给s21的协议。以一定价格将产品送给s3和s4的协议。

订单表

Product_ID   Seller  Buyer  SellingPrice      
   1001        s21     c      125
   1001        s31     c      150
   1001        s41     c      200

现在s21供应商终于找到了一个客户c并以125美元的价格卖给了他。现在,由于产品已经售出,您需要编写一个Java代码来说明如何将金钱分配给层次结构中的供应商。对于Ex-s21将为s2提供110美元,s2将为s1提供100美元,s1最终将为制造商M提供90美元。

我已经为此编写了代码,但这是一个迭代解决方案,下面是代码。

List<Agreement> agreementList; // [select* from Agreement]
List<Order> ordersList; // [select* from Orders]

for(Order o : ordersList){
  String seller = o.Seller;

  for(Agreement a : agreementList) {
    if(a.next_Supplier == seller) {
      System.out.println(a.next_Supplier + " will give " + a.sellingprice + " to " + a.seller);
      seller = a.Seller;
    }
  }
}

我想递归地解决它,但是不知道如何实现。任何解决方案都将不胜感激。

1 个答案:

答案 0 :(得分:0)

重写为这样的内容:

List<Agreement> agreementList; // [select* from Agreement]
List<Order> ordersList; // [select* from Orders]

Map<String, Agreement> agreementsBySupplier = 
  agreementList.stream().collect(Collectors.toMap(a -> a.next_Supplier, Function.identity()));

for(Order o : ordersList){
  String seller = agreementsBySupplier.get(seller);

  System.out.println(a.next_Supplier + " will give " + a.sellingprice + " to " + a.seller);
}

这显然仍然遍历了所有协议(并将所有协议加载到内存中)。

如果您真的想提高效率,可以使用其他SELECT

SELECT * FROM Orders o LEFT JOIN Agreement a ON o.seller = a.next_Supplier;
相关问题