Проблема проекта школы Java с Картами - PullRequest
0 голосов
/ 03 ноября 2019

Я работаю над школьным заданием.

Цель:

  • Я даю список клиентов супермаркетов
  • У каждого клиента естьпочтовый индекс и набор с названиями продуктов и подсчетом этих продуктов, которые приобрел этот клиент.
  • Меня просят вернуть карту (Sting = zipCode, Product = Product), которая должна содержать почтовый индекс в качествеключ и продукт, который больше всего продается по этому почтовому индексу.

Код, который мне дали:

/**
 * (DIFFICULT!!!)
 * calculates a map of most bought products per zip code that is also ordered by zip code
 * if multiple products have the same maximum count, just pick one.
 * @return
 */

public Map<String, Product> mostBoughtProductByZipCode() {
    Map<String, Product> mostBought = null;

    // TODO create an appropriate data structure for the mostBought and calculate its contents

    return mostBought;
}

Я пробовал использовать карту вКарта, но есть проблемы с ее реализацией. Это далеко не завершено и не компилируется вообще.

/**
 * (DIFFICULT!!!)
 * calculates a map of most bought products per zip code that is also ordered by zip code
 * if multiple products have the same maximum count, just pick one.
 * @return
 */
public Map<String, Product> mostBoughtProductByZipCode() {
    Map<String, Product> mostBought = null;
    Map<String, Map<Product, Integer>> zipCodeProducts = new HashMap<>();

    for (Customer customer : this.customers) {
        String tmp = customer.getZipCode();

        Map<Product, Integer> tmpMap = new HashMap<>();

        for (Purchase purchase: customer.getItems()) {
            tmpMap.put(purchase.getProduct(),purchase.getAmount());
        }


        if (!zipCodeProducts.containsKey(tmp)){
            zipCodeProducts.put(tmp, tmpMap);
        } else {
            ???
        }

    }

    // TODO create an appropriate data structure for the mostBought and calculate its contents

    return mostBought;
}

Какие шаги я могу предпринять, чтобы исправить эту реализацию? Я просто ищу подсказки, а не законченное решение.

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Вы на правильном пути, но вам нужно продумать, что происходит, когда вы впервые обнаружите комбинацию почтового индекса / продукта.

Существует довольно много Map способов, которые упростят эту задачу позже. версии Java. Я буду использовать их здесь, но если вам придется использовать более раннюю версию, вам нужно будет расширить некоторые из этих утверждений.

Что-то вроде следующего:

Map<String, Map<Product, Integer>> zipCodeProducts = new HashMap<>();
for (Customer customer: customers) {
    Map<Product,Integer> productCounts = zipCodeProducts.computeIfAbsent(customer.getZipCode(), () -> new HashMap<>());
    for (Purchase purchase: customer.getItems()) {
        productCounts.merge(purchase.getProduct(), 1, Integer::sum);
    }
}

Получение продуктас наибольшим количеством должно быть относительно просто:

Map<String,Integer> maxProducts = new HashMap<>();
zipCodeProducts.forEach((zc, pc) -> pc.forEach((pr, n) -> {
    if (!maxProducts.contains(zc) || n > pc.get(maxProducts.get(zc)))
        maxProducts.put(zc, pr);
}));

Надеюсь, что имеет смысл - спросите, если нет.

0 голосов
/ 03 ноября 2019

Я думаю, что вы хотите переместить оператор if в начало цикла for и создать tmpMap, только если он еще не существует для этого почтового индекса. Если он уже существует, просто используйте существующий и обновите его, указав продукты и сумму.

for (Customer customer : this.customers) {
        String tmp = customer.getZipCode();
        Map<Product, Integer> tmpMap;

        if (!zipCodeProducts.containsKey(tmp)){
             tmpMap = new HashMap<Product, Integer>();
        } else {
             tmpMap = zipCodeProducts.get(tmp);
        }


        for (Purchase purchase: customer.getItems()) {
            if (!tmpMap.containsKey(purchase.getProduct())) {
                tmpMap.put(purchase.getProduct(),purchase.getAmount());
            } else {
                tmpMap.put(purchase.getProduct(), tmpMap.get(purchase.getProduct()) + purchase.getAmount());
            }

        }

        zipCodeProducts.put(tmp, tmpMap);

    }
...