Обеспечить рекурсивное решение этой проблемы цепочки поставок - PullRequest
0 голосов
/ 09 мая 2019

Предположим, у меня есть две таблицы Соглашения и Заказы со следующей структурой.

Таблица соглашений

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

Думайте об этом как о проблеме цепочки поставок, когда на каждом уровне есть разные поставщики, и поставщик возьмет у Производителя М и договорится о передаче продукта поставщику следующего уровня. Таблица соглашений содержит соглашение между различными поставщиками, такие как s1 заключил соглашение о предоставлении продукта s2 за 100 долл. США (поставщик следующего уровня для s1) заключил соглашение о передаче продукта s21 за 110 долл. США. соглашение о передаче продукта 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 даст 110 долларов s2, а s2 - 100 долларов для s1, а s1, наконец, даст 90 долларов для производителя M.

Я написал код для этого, но это итеративное решение Ниже приведен код.

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 голосов
/ 09 мая 2019

Перепишите что-то вроде этого:

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;
...