假设我有两个表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处获得a,并将协议将产品提供给下一级供应商。协议表包含不同供应商之间的协议,如s1已达成协议以100.s2美元的价格将产品提供给s2(s1的下一级供应商)已达成协议以110美元的价格将产品提供给s21。s1还达成协议以一定的价格将产品提供给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;
}
}
}
我想递归地解决这个问题。但不知道如何实现。任何解决方案都将非常感谢。
最佳答案
重写如下:
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;