【问题标题】:Find Words in entire module在整个模块中查找单词
【发布时间】:2018-02-16 07:23:55
【问题描述】:

我有一个包含 ADC、FIFO、DAC、FILO 等的跳过列表。 我想知道这些词是否在整个模块中使用。如果在模块中使用应该返回未使用的词。 我有一个程序,但执行时间太长。 请帮我解决这个问题。

代码如下:

Skip Search_In_Entire_Module(Skip List)    
{   
    int sKey = 0    
    Skip sList      = create()    
    string data = ""
    string  objText1
    Object obj 

    for data in List do 
    {
        int var_count = 0
        for obj in m do 
        {
            objText1 = obj."Object Text"
            if objText1!=null then 
            {
                if (isDeleted obj){continue}
                if (table obj)    {continue}
                if (row obj)      {continue}
                if (cell obj)     {continue}        

                Buffer buf = create()
                buf    =   objText1
                int index = 0
                while(true)
                {
                    index = contains(buf, data, index)
                    if(0 <= index)
                    {
                        index += length(data)
                    }
                    else 
                    {
                        var_count++
                        break 
                    }
                }
                delete(buf)
            }
        }
        if (var_count ==0)
        {
            put(sList,sKey,data)
            sKey++
        }
    }
    return sList
}    

Unused_Terminolody_Data = Search_In_Entire_Module(Terminology_Data)

【问题讨论】:

    标签: ibm-doors


    【解决方案1】:

    只是想知道:为什么这是在一个while循环中?

                while(true)
                {
                    index = contains(buf, data, index)
                    if(0 <= index)
                    {
                        index += length(data)
                    }
                    else 
                    {
                        var_count++
                        break 
                    }
                }
    

    我宁愿这样做:

    index = contains ( buf, data )
    if ( index == -1 ) {
         var_count++
    }
    buf = ""
    

    我也不会继续删除和重新创建缓冲区。在创建对象变量的位置创建缓冲区,然后将其设置为等于 "" 以清除它,然后在程序结束时将其删除。

    如果这有帮助,请告诉我!

    【讨论】:

      【解决方案2】:

      Balthos 提出了很好的观点,我认为您还可以做更多的事情。我对您的功能的适应如下。注意事项:

      1. 我实施了 Balthos 的建议(上图),即取出 'while' 循环和缓冲区创建/删除。
      2. 我更改了函数签名。鉴于跳过列表已通过 通过引用,并且必须在函数之外创建和删除 将它们从 功能。所以,我通过了两个跳过列表(我们正在寻找的术语,不是 找到)作为函数参数。请原谅我改变变量 名称 - 它帮助我更快地了解正在发生的事情。
      3. 无需将对象文本放入字符串中 - 这是 相对较慢并消耗内存,直到 门退出。因此,我将对象文本放在前面的缓冲区中 功能,并搜索。我第 34 行的“if (!null bufObjText)” 相当于你的 'objText1!=null'。如果你愿意,'如果 (bufObjText != null)' 也是如此。
      4. 条件“if (var_count ==0)”是多余的 - 我把它移到了 将函数放入更早的“if”块中(我的第 40 行)。
      5. 我向上移动了已删除、表格、行和单元格对象的测试,所以 它们发生在我们花时间用对象填充缓冲区之前 text - 所以只有在必要时才会这样做。

      第 2 项可能不会对性能产生影响,但其他项会。唯一的问题是,有多大?

      请告诉我们这是否比您目前拥有的运行时间有所改善。我没有足够大的样本数据集来与您的代码进行有意义的比较。

      Module modCurrent = current
      
      Skip skUnused_Terminology_Data = create
      
      Skip skSeeking_Terminology_Data = create()
      
      put (skSeeking_Terminology_Data, 0, "SPONG")
      put (skSeeking_Terminology_Data, 1, "DoD")
      
      
      void Search_In_Entire_Module(Skip skTermsSought, skTermsNotFound)
      {
          Object obj
          Buffer bufObjText = create()
      
          int intSkipKey  = 0
          int index       = 0
          string strSkipData = ""
      
          for strSkipData in skTermsSought do
          {
              int var_count = 0
              bool blFoundTerm = false
      
              for obj in modCurrent do
              {
                  if (isDeleted obj){continue}
                  if (table obj)    {continue}
                  if (row obj)      {continue}
                  if (cell obj)     {continue}
      
                  bufObjText = obj."Object Text"
      
                  if (!null bufObjText) then
                  {
                      Regexp re = regexp2 strSkipData
      
                      blFoundTerm = search (re, bufObjText, 0)
      
                      if ( blFoundTerm ) {
                          put(skUnused_Terminology_Data, intSkipKey, strSkipData)
                          intSkipKey++
                      }
                      bufObjText = ""
                  }
              }
      
          delete (bufObjText)
      }
      
      
      Search_In_Entire_Module (skSeeking_Terminology_Data, skUnused_Terminology_Data)
      
      string strNotFound
      
      for strNotFound in skUnused_Terminology_Data do
      {
          print strNotFound "\n"
      }
      
      delete skUnused_Terminology_Data
      delete skSeeking_Terminology_Data
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多