如果匹配 FLUTTER 中的特定字符,则替换字符串中的字符

Posted

技术标签:

【中文标题】如果匹配 FLUTTER 中的特定字符,则替换字符串中的字符【英文标题】:replace characters in string if they matched specific chars in FLUTTER 【发布时间】:2022-01-20 17:34:43 【问题描述】:

我正在创建一个 POS,我想将购买的商品显示为文本,并且我也打算将这些商品存储为文本。我用 '\n' 字符分隔每个项目。

现在的问题是我不知道如何检查与某个产品特别匹配的文本。我尝试过使用 string.contains 方法,但这不是我想要的。

例如:我的产品名称如下:

鸡 鸡肉奶酪

现在这是两种不同的产品,但每一种鸡肉奶酪都会含有鸡肉。

那么,我该如何更换产品

产品在一个列表中,是地图的一部分。 但是,对于这个问题;您可以假设所有项目都存储为列表,示例如下:

['chicken', 120],

['chicken Cheeze', 150],

['chicken Cheeze Pizza', 180],

.......................

然后,在代码中,我将这些产品保存为字符串(点击时)。

// Gesture Detector is inside a Galleryview which is further part of a row and expanded widgets,
GestureDetector(
     onTap: () 
     //bill items is a string Storing all products.
          billItems += (item[0] +
                    ' :   ' +
                    item[1].toString() + '\n');
               ,

P.s:我想要做的就是做类似的事情:“鸡 * 3”如果鸡被订购 3 次而不是打印 3 次。谢谢

【问题讨论】:

我没有关注你,你必须在项目描述栏旁边加上一个数量框。现在如果鸡与不同的项目匹配很好,你应该根据第一个字母而不是它自己的单词进行过滤,所以如果你以C开头,所有C项目都会出现,依此类推,直到你找到正确的chiken单词,然后一旦你用 c 跟随鸡肉,它就会过滤奶酪。这就是你想要的吗? 如果你想看看我是怎么做到的,我可以分享一个我已经做过的页面 你也可以使用条码扫描器来抓取物品 你能分享一些代码吗?特别是您在哪里填充购买的物品。 @esentis 我已经用代码更新了你的问题。希望这将有助于理解问题。谢谢你的时间。如有任何困惑,请不要犹豫: 【参考方案1】:

所以,我想出了一个解决方案,虽然我不知道它有多优化或多快。

我首先创建一个产品模型来序列化它:

class Product 
  String name;
  double price;
  int count;

  Product(required this.name, required this.price,this.count=0);

  factory Product.fromDynamic(List product) =>
      Product(name: product[0], price: product[1]);

  Map<String, dynamic> toJson() 
    return "name": name, "price": price,"count":count,;
  

所以假设我们的产品是这种形式:

  final originalProducts = [
    ['chicken', 120],
    ['chicken', 135],
    ['chicken', 140],
    ['chicken Cheeze', 150],
    ['chicken Cheeze Pizza', 180],
  ];

我创建了一个List&lt;Product&gt;

  List<Product> modeledProducts =
      List.generate(originalProducts.length, (i) => Product.fromDynamic(originalProducts[i]));

接下来我创建一个临时的List&lt;String&gt;,我将在其中保存找到的所有重复产品(它们的名称),并创建最终的List&lt;Products&gt;,其中将包含独特的产品及其价格:

  List<String> duplicates = [];

  List<Product> finalProducts = [];

然后我们遍历modeledProducts 以查找重复项并进行必要的操作:

  for (final product in modeledProducts) 
    if (!duplicates.contains(product.name)) 
      duplicates.add(product.name);
      finalProducts.add(product);
     else 
      finalProducts.firstWhere((p) => p.name == product.name).price +=
          product.price;
      finalProducts.firstWhere((p) => p.name == product.name).count++;
    
  

现在您可以使用您的数据了:

  for (final fProduct in finalProducts) 
    print(fProduct.toJson());
  

上面将打印:

name: chicken, price: 395, count: 3
name: chicken Cheeze, price: 150, count: 1
name: chicken Cheeze Pizza, price: 180, count: 1

【讨论】:

您好 Esentis,感谢您的回答。我认为克服这个问题是一种复杂且计算/资源昂贵的方法。 我花了一段时间才弄明白。完成任务的最佳方式是使用“MAP”。我们需要将名称存储为键,将价格存储为值。它会在找到密钥后分配一个新值。谢谢。

以上是关于如果匹配 FLUTTER 中的特定字符,则替换字符串中的字符的主要内容,如果未能解决你的问题,请参考以下文章

如果系列的值包含pandas中的特定字符集,则替换后续字符

如果不匹配则替换字符

正则的学习

替换字符串中的重叠匹配项(正则表达式或字符串操作)

电脑系统批处理,如何将多个tab替换为一个tab,而单个的tab不变化?

正则表达式 - 如果模式匹配,则替换双引号之间的字符(逗号)