【问题标题】:FLUTTER - Checking if a string contains another oneFLUTTER - 检查一个字符串是否包含另一个字符串
【发布时间】:2022-01-13 11:18:04
【问题描述】:

我正在开发一个英语词汇学习应用程序。给用户的一些练习是书面测验。他们必须将法语单词翻译成英语单词,反之亦然。

为了使检查比“1”或“0”(TypedWord == expectedWord)更复杂一些,我一直在处理字符串之间的相似性,并且效果很好(例如拼写错误)。

我也使用了 contains 函数,例如,如果用户在预期单词前面添加了一篇文章,它不会认为它是错误的。 (例如:Ecole(应该是学校),但用户写的是“A school”)。

所以我检查了诸如“if (typedWord.contains(word)==true) then...”之类的行。它适用于文章问题。 但它提示了另一个问题:

Ex : A bough --> 预期的法语单词是“branch”。如果用户键入“une branche”,它认为它是正确的,这很好。但是如果用户键入“débrancher”(拔掉插头),它认为它是正确的,并且“branche”这个词是“débrancher”的一部分......

我怎样才能避免这种情况发生?知道其他方法吗?

我阅读了三个非常有趣的建议答案。问题是有些词是复合词......“例如:厨房用具,园艺工具”等......所以我认为“空间”功能可能有问题......

【问题讨论】:

    标签: list flutter dart contains


    【解决方案1】:

    在这种情况下,将整个答案用“空格”隔开,然后与正确的单词进行比较。

    For an example:
    User's answer: That is my school
    Separate it with space, so that you will find an array of words:
    that, is, my, school. 
    

    然后将每个单词与您的单词进行比较。它会给你正确的答案。

    flutter 代码如下:

      usersAnswer?.split(" ").forEach((word){
        if(word == correctAnswer) 
          print("this is a correct answer");
      });
    

    【讨论】:

    • 这很有趣。有些词不止一个词……例如:“厨房用具”……然后用户可以输入“厨房用具”……
    • 在这种情况下,您也可以将答案拆分为数组,并将每个答案与回答的数组进行比较。如果您的答案列表中的每个项目都出现在用户的答案列表中,那么您可以将其预测为正确答案。
    • 是的,这就是我开始研究的内容......现在我必须将它与使用“链相似函数”检查拼写错误相结合......事实上,如果对于法语“厨房用具”(Appareil électroménager)的词,用户回答“厨房用具”,这与他回答“花园工具”的错误类型不同......但它不应该被认为与“厨房用具”一样好" ;)
    • typedWord!.split(" ").forEach((subAnswer) { if (subAnswer.toLowerCase() == word!.toLowerCase()) { _reussiteExo = Reussite.totale; } else if ( removeAccents(subAnswer.toLowerCase()) == removeAccents(word.toLowerCase())) { _reussiteExo = Reussite.partielleAccent; } else if (removeAccents(subAnswer.toLowerCase()) .similarityTo(removeAccents(word.toLowerCase())) > 0.8) { _reussiteExo = Reussite.partielleOrth; } });
    • 我为此使用了 levenstein 算法。它看起来工作得很好。遇到了一个我昨天没有想到的新问题:单词的顺序;)如果预期的答案是“花园工具”而用户回答“工具花园”......这实际上是本地人的典型错误法语(单词的顺序不同),应该指出错误是由于单词顺序问题......今天正在努力......并试图结合所有错误:如果用户回答“A toul garden" --> 两个错误:一个拼写错误和一个顺序错误...
    【解决方案2】:

    您可以检查正确单词前后的空格:例如if (typedWord.contains(' '+word+' ')==true) then...,以便将“débrancher”标记为错误。不过,这有点严格:如果句子必须用一些标点符号完成,则该检查将拒绝该句子。您可能需要一些允许标点符号但不允许空格的 RegExp。

    【讨论】:

    • 这不适用于句子的第一个单词和最后一个单词。
    【解决方案3】:

    您可以按空格分割字符串并检查结果数组是否包含您要查找的单词。

    typedWord.split(' ').contains('debranche');
    

    所以如果typedWord 是'une branchethesplit(' ') 将把它变成这个数组:['une', 'branche']。 现在,当您检查此数组 contains('branche') 是否存在时,它将检查是否存在确切的字符串分支,在这种情况下它确实存在并返回 true。

    但是,如果它是 'une debranche',则结果数组将是:['une', 'debranche'],并且因为该数组没有等于 'branch' 的值,它将返回 false。请记住,当您使用split 时,它会将字符串转换为数组,并通过在数组上使用contains,它会检查是否存在与您提供的值完全相同的项目contains,而在字符串中它会检查如果该字符串的一部分与给定值匹配。

    【讨论】:

    • contains 仍将与“débrancher”一起使用,因为它会将其拆分为一个单词。
    • @YanniTheDeveloper 在“débrancher”上拆分的结果将是一个长度为 1 的数组。然后通过在这个数组上使用contains,它将检查两个字符串是否完全相同。这不像 contains 在字符串上如果部分匹配则返回 true。
    • 哦,明白了。
    • 我编辑了我的问题的结尾......因为有些词是复合词:例如“厨房用具”
    猜你喜欢
    • 2013-03-13
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多