【问题标题】:Finding an object in Java ArrayList and changing its value在 Java ArrayList 中查找对象并更改其值
【发布时间】:2020-09-15 10:43:26
【问题描述】:

我有两个列表:

List<Product> productsListOne;
List<Products> productsListTwo;

第一个列表包含所有产品,第二个列表包含一些产品(其中一些产品具有相同的 id),但类别不同。 我的目标是查找productsListOne 中是否有来自productsListTwo 的产品ID。任务的第二部分是,如果找到这样的产品,它需要将productsListOne 产品类别从productsListTwo 的产品更改为相同的类别。 我用for each 循环尝试了一些解决方案,但没有取得更大的成功。

       for (Product secondListProduct: productsListTwo) {
            for (Product firstListProduct: productsListOne) {
                if (productsListTwo.get(productsListTwo.indexOf(secondListProduct)).getId() == firstListProduct.get(firstListProduct.indexOf(firstListProduct)).getId()){
                    firstListProduct.get(firstListProduct.indexOf(firstListProduct)).setCategory(productsListTwo.get(productsListTwo.indexOf(secondListProduct)).getCategory());
                }
            }
        }

第二次尝试使用流:

        for (Product p:secondListProduct) {
            if(firstListProduct.stream().filter(o -> o.getId() == p.getId()).findFirst().isPresent()){
                System.out.println("found one");
            }
        }

【问题讨论】:

  • 向我们展示您迄今为止的尝试?还有一个输入输出示例
  • 这里其实不需要indexOf,你可以像if (firstListProduct.getId() == secondListProduct.getId()){firstListProduct.setCategory(secondListProduct.getCategory());}一样操作

标签: java arraylist collections


【解决方案1】:

您可以尝试以下两种解决方案之一(带/不带流)。两种解决方案都评估在第一个列表中可以存在多个具有相同 id 的项目。如果不是这种情况,那么您可以通过在内部 if 语句的末尾添加 break 来使用双 for 循环轻松解决它。

带流:

for (Product product : productsListTwo) {
  productsListOne = productsListOne.stream()
        .map(p -> {
            if (p.getId() == product.getId()) {
                p.setCategory(product.getCategory());
                return p;
            }
            return p;
        })
    .collect(Collectors.toList());
}

没有流:

for(Product product: productsListTwo) {
  for (int i = 0; i < productsListOne.size(); i++) {
    Product listOneProduct = productsListOne.get(i);
    if (listOneProduct.getId() == product.getId()) {
      listOneProduct.setCategory(product.getCategory());
      break; // if each id exists only one time in the list - otherwise remove
    }
  }
}

【讨论】:

  • without for 解决方案怎么样? productsListTwo.forEach(product -&gt; {...} 怎么也不适用...
  • 嗯,有很多方法可以迭代 List :) 你显然可以在不同的方法之间切换
  • 你认为productsListOne.set(i, listOneProduct)这需要吗?
  • 如果您使用不可变数据并且实际上您复制了从列表中获得的产品然后更改它(在答案中省略),则需要它。否则,如果您的数据是可变的,则它不是。
【解决方案2】:
for (final Product product in productsListOne) {
   for (final Products products in productsListTwo) {
      if (product.id == products.id) {
         product.category = products.category;
         break;
      }
   }
}

【讨论】:

  • 你不应该使用==来比较Java中的字符串,因为你是在比较内存地址而不是实际的字符串内容。
  • 你怎么知道它是字符串还是长)),作者没有显示什么是 id 类型
  • 你是对的。我不好假设这样的事情 - 看来你是对的,OP 正在使用 longs :)
  • id 字段是long 所以== 在这里露营很好,但是是的,我忘了提。
猜你喜欢
  • 2013-10-12
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
相关资源
最近更新 更多