сложность добавления в не * * * * arraylist - PullRequest
1 голос
/ 04 мая 2020

Я пытаюсь добавить в arraylist arraylists. У меня есть arraylist с именем prod и 2d arraylist с названием shoppingBasket.

Основная проблема у меня заключается в том, что я хочу добавить несколько товаров в корзину (ie несколько списков товаров в список shoppingBasket), но вместо при этом первый элемент корзины заменяется следующим (поэтому в корзине есть только каждый элемент). Я довольно новичок в java и не уверен, как это исправить.

Я также попытался создать еще один класс 'item', затем создать объекты отсюда, а затем добавить в массив как ArrayList, например

public class Item {
    private int bar;
    private String name;
    private String type;
    private String brand;
    private String colour;
    private String con;
    private int quantity;
    private float cost;
    private String addi;

    public Item (int bar, String name, String type, String brand, String colour, String con, int quantity,float cost, String addi) {
        this.bar = bar;
        this.name = name;
        this.type = type;
        this.brand = brand;
        this.colour = colour;
        this.con = con;
        this.quantity = quantity;
        this.cost = cost;
        this.addi = addi;
    }

  public class Basket {
    //arraylist for the shopping basket
    private ArrayList<Item> shoppingBasket;

    public Basket() {
        shoppingBasket = new ArrayList<>();
    }

    //function adding items to the basket
    public void addToBasket(int bar, String name, String type, String brand, String colour, String con, int quantity, float cost, String addi) {

         Item items = new Item (bar, name, type, brand, colour, con, quantity, cost, addi);
         shoppingBasket.add(items);
    }
  }

Когда я попробовал этот метод, Анад напечатал массив для проверки, я бы просто показал что-то вроде [Item@23455] и все равно заменил бы изначально элемент вместо того, чтобы добавить, плюс я не очень понимаю, как это сделать правильно, так что если бы кто-нибудь мог объяснить мне этот метод (если это проще использовать, чем то, что я уже сделал) это будет с благодарностью. Хотя я бы тоже предпочел, чтобы мне не пришлось слишком сильно менять свой код.

Код, о котором идет речь: функция в одном классе, которая добавляет элемент в корзину.

public class Basket {
    //arraylist for the shopping basket
    private ArrayList<ArrayList<String>> shoppingBasket;

    public Basket() {
        shoppingBasket = new ArrayList<>();
    }

    //function adding items to the basket
    public void addToBasket(int bar, String name, String type, String brand, String colour, String con, int quantity, float cost, String addi) {

          ArrayList<String> prod = new ArrayList<>();

          //adding one item to the basket shop.add(bar); shop.add(name);
          prod.add(Integer.toString(bar)); 
          prod.add(name); 
          prod.add(type); 
          prod.add(brand); 
          prod.add(colour); 
          prod.add(con);
          prod.add(Integer.toString(quantity));
          prod.add(Float.toString(cost)); 
          prod.add(addi);

          shoppingBasket.add(prod); 

        System.out.println(shoppingBasket);     

    }

nb элементы добавляются из таблицы с использованием прослушивателя в другой таблице (каждая ячейка это другая переменная):

selectionModel.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {

                int row = tableViewAll.getSelectedRow();

                viewAllModel=(DefaultTableModel) tableViewAll.getModel();

                int bar=Integer.parseInt(viewAllModel.getValueAt(row,0).toString());
                String name = viewAllModel.getValueAt(row,1).toString();
                String type = viewAllModel.getValueAt(row,2).toString();
                String brand = viewAllModel.getValueAt(row,3).toString();
                String colour= viewAllModel.getValueAt(row,4).toString();
                String con = viewAllModel.getValueAt(row,5).toString();
                int quantity=1;
                float cost=Float.parseFloat(viewAllModel.getValueAt(row,7).toString());
                String addi= viewAllModel.getValueAt(row,8).toString();

                Basket item = new Basket();
                item.addToBasket(bar, name, type, brand, colour, con, quantity, cost, addi);    

Заранее спасибо:)

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Проблемы с вашим дизайном / кодом и решением:

  1. Item не должен знать, сколько его чисел присутствует в Basket. Его номер должен быть передан в корзину при добавлении. Итак, удалите атрибут quantity из Item.
  2. . Вам нужно Map вместо List, потому что при повторном добавлении существующего элемента в корзину должно увеличиться только его количество.
class Basket {
    private Map<String, Integer> basket = new HashMap<String, Integer>();

    public void addToBasket(Item item, int quantity) {
        if (item != null) {
            String key = item.getName();
            basket.put(key, basket.getOrDefault(key, 0) + quantity);
        }
    }

    public void showBasket() {
        for (Entry<String, Integer> entry : basket.entrySet()) {
            System.out.println("Item = " + entry.getKey() + ", Quantity = " + entry.getValue());
        }
    }
}
Basket сбрасывается при каждом вызове valueChanged. Переместите следующий код за пределы valueChanged и поместите его в класс вместо метода.
Basket item = new Basket();

Он должен быть написан как

Basket basket = new Basket();
selectionModel.addListSelectionListener(new ListSelectionListener() {
    @Override
    public void valueChanged(ListSelectionEvent e) {

        int row = tableViewAll.getSelectedRow();

        viewAllModel=(DefaultTableModel) tableViewAll.getModel();

        int bar=Integer.parseInt(viewAllModel.getValueAt(row,0).toString());
        String name = viewAllModel.getValueAt(row,1).toString();
        String type = viewAllModel.getValueAt(row,2).toString();
        String brand = viewAllModel.getValueAt(row,3).toString();
        String colour= viewAllModel.getValueAt(row,4).toString();
        String con = viewAllModel.getValueAt(row,5).toString();
        float cost=Float.parseFloat(viewAllModel.getValueAt(row,7).toString());
        String addi= viewAllModel.getValueAt(row,8).toString();
        basket.addToBasket(new Item(bar, name, type, brand, colour, con, cost, addi), 1);    
        //...
    });

Как только вы расширите свой Пользовательский интерфейс, чтобы иметь поле ввода (текстовое поле / выпадающий список) для количества, вы получите количество из поля ввода и передадите его в addToBasket вместо 1.

0 голосов
/ 04 мая 2020

Вы каждый раз создаете новую Корзину в своем слушателе: Basket item = new Basket(); Когда вы каждый раз создаете новый экземпляр и добавляете элемент, в «новой» корзине будет только один элемент.

Вы необходимо создать один экземпляр (возможно, в вашей модели) и использовать этот экземпляр для добавления элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...