【问题标题】:Changing the field value of unique and non-unique objects更改唯一和非唯一对象的字段值
【发布时间】:2023-01-10 19:44:41
【问题描述】:

我有这样一个产品类。

@Data
public class Product {
    private UUID id;
    private String name;
    private String categoryName;
    private String frontName;
}

我有一个产品列表——有些产品名称是相同的,即使它们有不同的类别。我需要为具有相同名称的产品执行以下操作: product.setFrontName(product.getName() + "," product.getCategoryName())

对于具有唯一名称的产品,只需要做:product.setFrontName(product.getName())

我尝试了流的各种选项,但最终找不到解决方案。

你能分享一个更有效的解决这个任务的方法吗?谢谢你。

【问题讨论】:

  • 如果您的数据库中有一个具有唯一名称的产品并添加另一个具有相同名称(但其他类别)的产品,那么形式上唯一的产品是否也应该更改其在数据库中的名称?
  • 当您添加新产品时,我们需要查看您的代码,因为在这种情况下,您可能需要更改新产品的 FrontName,也可能需要更改旧产品的 FrontName。
  • 这是一个两步过程。首先,您需要确定哪些是唯一名称。做完这些,就可以进行需要的操作了
  • @XtremeBaumer 有一个产品类产品列表。如果工作表包含名称在集合中仅出现一次的产品,则它是唯一的。为此,我需要执行 product.setFrontName(product.getName)。
  • 如果列表包含名称多次出现的产品,那么它不是唯一的,对于这样的产品,我需要执行 product.setFrontName (product.getName + "," product.getCategoryName)

标签: java algorithm function collections stream


【解决方案1】:

请看下面的代码:

Set<String> items = new HashSet<>()
Set<String> duplicateProduct = productList.stream()
            .filter(p -> !items.add(p.name)).map(Product::getName) // Set.add() returns false if the element was already in the set.
            .collect(Collectors.toSet());

    productList.forEach( p ->{
       if(duplicateProduct.contains(p.getName())){
           p.setFrontName(p.getName() + "," + p.getCategoryName());
       } else {
           p.setFrontName(p.getName());
       }
    });

【讨论】:

    【解决方案2】:

    有几种方法可以解决问题。

    例如,我的第一个想法是说您有一个包含所有产品的 List<Product>,那么您需要:

    1. 遍历所有产品并将每个产品按名称保存在 Map<String, List< Product>> 中。同名产品应存储在以名称为键的 List<Product> 值中。

    2. 遍历此映射的所有条目并检查列表的大小是否大于 1,这意味着该产品与其他产品具有重复(或更多)名称。否则它是独一无二的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多