Игнорировать существующий элемент в LInkedList - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь игнорировать существующий элемент, который я добавил в дубликате.

Обычно, если элемент не существует, он в конечном итоге добавляет элемент в LinkedList Когда я снова пытаюсь добавить элемент, я просто хотел проигнорировать процесс добавления и увеличить значение на 1. Но проблема в том, что он продолжает добавлять элементы в LinkedList .

Может кто-нибудь объяснить мне?


class Item{
   Store store;
   String name;
   String code;
   String number;
   public Item(String name, String code){
     this.name = name;
     this.code = code;
     number = 0;
   }
   public boolean itemExists(String name, String code){
    return this.name.equals(name) && this.code.equals(code);
   }

   public void increment(){ number++; }

   @Override
   public String toString(){ return store.getName()+ " " + name + " " + code + " " +number; }
}

Товары будут добавлены на фабрику.

class Factory{
  private LinkedList<Item> items = new LinkedList<Item>():
  private String name;
  private String number;

  public Factory(String name, String number){
    this.name = name;
    this.number = number;
  }
  public void getName(){
   return name;
  }

  public void addItem(String name, String code){
     items.add(new Item(this, name, code));
  }

  @Override
  public String toString(){ return name + " " + number; }

  public List<Item> getItems{
    return items;
  }
}

Фабрика с доставкой в ​​магазин.

class Store{
  private LinkedList<Factory> factories = new LinkedList<>();

  public Store(){
     factories.add(new Factory("MayFlower", "01");
     factories.add(new Factory("SunFlower", "02");
     factories.get(0).addItem("GTA", "001A");
     factories.get(0).addItem("GTA", "002A");
     factories.get(0).addItem("GTA", "003A");

     factories.get(1).addItem("Sonic", "022A");
     factories.get(1).addItem("Sonic", "023B");
     factories.get(1).addItem("Sonic", "024C");

  }

  public List<Item> getItemFromFact(){
    List<Item> temp = new ArrayList<>();
    for(Factory factory: factories) 
        for(Item item: factory.getItems())
            temp.add(item);
    return temp;
  }

}

Покупатель покупает товары в магазине.

class Customer{
  private LinkedList<Item> items = new LinkedList<>();

  public static void main(String args[]){
     new Customer.view();
  }

  private void view(){
    for(Item item: items)
       System.out.println(item);
  }

  private void adding(){
    String name = "GTA";
    String code = "001A":
    List<Item> item = item(name, code);
    if(!item.isEmpty()){
      items.add(item);
      item.increment(); // will increment the value;
    }   
    else{
     System.out.println("Item does not exists");
    }
  }

  private List<Item> item(String name, String code){
    List<item> temp = new ArrayList<>();
    List<item> fromStore = new Store().getItemFromFact();
    for(Item item: fromStore) 
        if(item.itemExists(name, code))
           temp.add(item)
    return temp;
  }
}

Основная проблема заключается в классе товара в item(). Если я попытаюсь снова с тем же предметом, он просто добавит еще один, он станет таким.

MayFlower GTA 001A 1
MayFlower GTA 001A 1

Результат должен быть

MayFlower GTA 001A 2

после добавления другого элемента.

У меня проблема в том, что я не знаю, как сопоставить элемент от существующих. Если кто-то знает решение. Это было бы очень полезно, спасибо.

1 Ответ

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

В вашем дизайне и коде так много проблем. Я обсуждал некоторые из них, как указано ниже:

  1. Я не понимаю, почему вам нужна ссылка на Store в Item. Item не должен знать, к какому Store или Factory он будет принадлежать.
  2. Я также не понял назначение атрибута, number в Store. Item не должен знать, сколько его чисел присутствует в Store или Factory. Если вы сохраняете его по какой-либо причине, он должен иметь тип цифры c (например, int, double и c.), Чтобы вы могли выполнять над ним арифметические операции c.
  3. Вместо LinkedList из Item объектов в Factory у вас должна быть переменная типа Map<String, Integer>, и вы можете назвать ее stock. Ключ в этом Map является уникальным идентификатором предмета, который является комбинацией code и name согласно вашему требованию, и значением будет доступное число / количество Item. Ниже приведен минимальный проверяемый пример того, как вы можете поддерживать stock:
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

class Item {
    String name;
    String code;

    public Item(String name, String code) {
        this.name = name;
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public String getCode() {
        return code;
    }

    @Override
    public String toString() {
        return "Name: " + name + "Code :" + code;
    }
}

class Factory {
    private Map<String, Integer> stock = new HashMap<String, Integer>();
    private String name;

    public Factory(String name) {
        this.name = name;
    }

    public void addItem(Item item) {
        if (item != null) {
            String key = item.getName() + ":" + item.getCode();
            stock.put(key, stock.getOrDefault(key, 0) + 1);
        }
    }

    public void showStock() {
        for (Entry<String, Integer> entry : stock.entrySet()) {
            System.out.println("Item = " + entry.getKey() + ", Available quantity = " + entry.getValue());
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Factory factory = new Factory("MayFlower");

        factory.addItem(new Item("GTA", "001A"));
        factory.addItem(new Item("GTA", "001A"));

        factory.addItem(new Item("GTA", "002A"));

        factory.addItem(new Item("GTA", "003A"));
        factory.addItem(new Item("GTA", "003A"));
        factory.addItem(new Item("GTA", "003A"));

        factory.showStock();
    }
}

Вывод:

Item = GTA:002A, Available quantity = 1
Item = GTA:003A, Available quantity = 3
Item = GTA:001A, Available quantity = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...