Как распечатать каждый объект в массиве и правильно подсчитать их количество? - PullRequest
0 голосов
/ 06 декабря 2018

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

У меня есть 2 проблемы с моим текущим кодом: во-первых, он печатает только последний элемент в массиве.Во-вторых, он возвращает неправильное количество для напечатанного элемента.

package shop;

import java.text.DecimalFormat;
import java.util.ArrayList;

public class ShoppingCart {
static ArrayList<Product> cart;

    public ShoppingCart() {
        ShoppingCart.cart = new ArrayList<Product>();
    }

    @Override
    public String toString() {
        DecimalFormat format = new DecimalFormat ("#.00");
        int quantity = 0;
        double price = 0;
        String name = null;
        double total = 0;
        for (Product p: cart) {
            quantity = p.getQuantity();
            price = p.getPrice();
            name = p.getName();
            total = p.getTotalPrice();  
        }
        return quantity + " * GBP    " + format.format(price) + " " + name            + "    = GBP   " + format.format(total);  
    }
    public void add(Product p) {
            if(cart.size() > 0) {
                for (int i = 0; i < cart.size(); i++) {
                    if(cart.get(i).getName().equals(p.getName()) 
                    && cart.get(i).getPrice() == p.getPrice()) {

                        cart.get(i).setQuantity(cart.get(i).getQuantity() + p.getQuantity());

                    }else {
                        cart.add(p);
                    }
                }
            }else {
            cart.add(p);
        }
    }   

    public static void main(String[] args) {
        ShoppingCart newCart = new ShoppingCart();

        Product apple, apples, milk, caulk, ice, snakes;
        apple = new Product("Apples (4 pack)", 1.20, 1);
        apples = new Product("Apples (4 pack)", 1.20, 2);
        milk = new Product("Milk (1l)", 0.75, 1);
        caulk = new Product("Caulk (1l)", 6.84, 1);
        ice = new Product("Ice (1kg)", 4.30, 1);
        snakes = new Product("Snake (5m)", 32.0, 1);

        newCart.add(apple);
        newCart.add(apple);
        newCart.add(apple);
        newCart.add(apple);
        newCart.add(caulk);
        newCart.add(milk);


        System.out.println(newCart);


    }
}

Вывод

4 * GBP    .75 Milk (1l)    = GBP   3.00

Я предполагаю, что что-то пошло не так в моих toString() и add()методы, но я не могу сказать, что.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018
  1. Вам необходимо реализовать Product.toString() следующим образом, например:

    @Override
    public String toString() {
        DecimalFormat format = new DecimalFormat("#.00");
        return String.format("%d * GBP %5s %15s= GBP %5s", quantity, format.format(price), 
                                                    name, format.format(price * quantity));
    
    }
    
  2. И ShoppingCart.toString() будет использовать Product.toString() каждого Product:

    @Override
    public String toString() {
        double total = 0;
        StringBuilder sb = new StringBuilder();
        for (Product p : cart) {
            sb.append(p.toString()).append("\n");
            total += p.getTotalPrice();
        }
        sb.append(String.format("%s%33.2f", "Total :", total));
        return sb.toString();
    }
    
  3. Наконец, вы получите:

    8 * GBP  1,20 Apples (4 pack)= GBP  9,60
    2 * GBP  6,84      Caulk (1l)= GBP 13,68
    4 * GBP   ,75       Milk (1l)= GBP  3,00
    4 * GBP   ,75       Milk (1l)= GBP  3,00
    Total :                            29,28
    

Как и сейчас, когда вы устанавливаете новый quantity этовлияет на исходный объект, на который он ссылается в списке, вам нужно добавить копию в списке, а также изменить цикл: когда вы найдете тот же продукт, измените количество, затем вернитесь, и ** только в конце цикла* если вы не нашли продукт, который вы добавите, вам нужно подождать, чтобы проверить все существующие продукты:

public void add(Product p) {
    if (cart.size() > 0) {
        for (Product product : cart) {
            if (product.getName().equals(p.getName()) && product.getPrice() == p.getPrice()) {
                product.setQuantity(product.getQuantity() + p.getQuantity());
                return;
            }
        }
        cart.add(new Product(p));
    } else {
        cart.add(new Product(p));
    }
}

А в классе Product конструктор копирования:

public Product(Product p) {
    this.quantity = p.quantity;
    this.price = p.price;
    this.name = p.name;
}

Кроме того, не делайте список статичным, каждая корзина покупок имеет свой список

private ArrayList<Product> cart;

public ShoppingCart() {
    cart = new ArrayList<>();
}
0 голосов
/ 06 декабря 2018

В методе toString() у вас есть цикл for, но вы просто сохраняете данные последнего элемента в цикле.вы должны исправить это так:

   String name = "";
   for (Product p: cart) {
        quantity += p.getQuantity();
        price += p.getPrice();
        name += p.getName();
        total += p.getTotalPrice();  
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...