HashMap List проблемы с обновлением значения элемента в Java - PullRequest
0 голосов
/ 03 апреля 2020

У меня проблема, так как у меня есть список продуктов, который содержит несколько типов, однако я хочу показать общие данные, но они были повторены в списке, теперь я могу заставить их существовать только один раз, но проблема в том, что когда я хочу установить результат, когда элемент уже существует в моем Ha ​​sh, он не выполняет этот набор, я не знаю, связан ли он с мелкой копией Java, я пробовал Cloneable, но это не удалось.

  @RequiresApi(api = Build.VERSION_CODES.N)
  public List<ProductsAlmacenInfo> getProductsTotal() {
    HashMap<Long, ProductsAlmacenInfo> map = new HashMap<Long, ProductsAlmacenInfo>();
    for (ProductsAlmacenInfo x: products) {
      ProductsAlmacenInfo temp = x;
      if(map.containsKey(x.getId_product().toString()) && (x.getStock_type().contentEquals("VTA") ||
              x.getStock_type().contentEquals("VDO") || x.getStock_type().contentEquals("CHG"))) {
        temp.setQty(Math.abs(x.getQty()+1));
        map.replace(temp.getId_product(), temp);
      }
      else if (!map.containsKey(x.getId_product().toString())) {
        temp.setQty(Math.abs(x.getQty()));
        map.put(x.getId_product(), temp);
      }
    }
    List<ProductsAlmacenInfo> productsTemp = new ArrayList<ProductsAlmacenInfo>(map.values());
    if(productsTemp.isEmpty())  return products;
    return productsTemp;
  }[enter image description here][1]

1 Ответ

0 голосов
/ 03 апреля 2020

Чтобы вставить новую запись или объединить с существующей, используйте метод merge():

HashMap<Long, ProductsAlmacenInfo> map = new HashMap<>();
for (ProductsAlmacenInfo x : products) {
    x.setQty(Math.abs(x.getQty())); // Why?

    map.merge(x.getId_product(), x, (a, b) -> {
        ProductsAlmacenInfo temp = b.clone(); // or use copy-constructor
                                              // or don't copy if not needed
        temp.setQty(a.getQty() + b.getQty());
        return temp;
    });
}

Все свойства, кроме id_product и qty, будут иметь значения из последнего увиденного объекта за это id_product. Если вы хотите получить значения от первого увиденного объекта, клонируйте a вместо b.

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