在文本文件java中找到目标模式

时间:2014-04-11 13:12:55

标签: java regex pattern-matching text-files

我有一个只有+'和空格的文本文件。我必须在这个文件中找到一个看起来像宇宙飞船的目标。但宇宙飞船并不一定非常完美。

提前致谢

这是带有目标的文本文件,较小的版本。这里至少有一个目标。

+ ++ +   + + +    +     +  + +++  +              
         +   ++ + + ++    +   +  ++ ++ +      +    
   +  +            + +     ++ +   +  ++++ ++         
+    +   ++++       + ++ +      ++ +                       
 +               +     +   + ++ +   ++   +     +    
 +      +              +       + ++ + +  +       +   
         +  +    ++ +     +   +++ ++  +++          
 +   +       + +         ++    + ++  ++      +  ++  
+    +    +         + + ++  + + + + ++  + +         
+   ++        +  +             ++ ++ +++        +      
         +  ++ +   ++       +   + +   + ++   ++ +  
 + +    ++ ++   +      +       +            +   +  
    + +  + +         +       ++    +     +  

这是目标

    +     
    +     
   +++    
 +++++++  
 ++   ++  
++  +  ++ 
++ +++ ++ 
++  +  ++ 
 ++   ++  
 +++++++  
   +++    

我试过Regex模式阅读,但文件太大,所以我决定反对。我不知道有任何其他方法可以解决这个问题。

1 个答案:

答案 0 :(得分:0)

我认为你不能或者不需要做任何真正喜欢的事情。

您可以从编码模式开始。在这种情况下,您可以:

  1. 将每一行编码为一个字符串,并将这些行本身编码为一个数组:String[]
  2. 将每一行编码为一个字符串,并将这些行本身编入List:List<String>
  3. 将每一行编码为char [],并将这些行编码为数组:char[][]
  4. Number 3的好处是您可以轻松地将其索引为矩阵:

    char[][] matrix = ...;
    char ch = matrix[row][column];
    

    所以你有:

    char[][] search = new char[searchRows][searchColumns];
    char[][] target = new char[targetRows][targetColumns];
    

    你的算法可能是:

    1. 对于搜索中可能出现目标的每个可能位置,计算相等的字符数
    2. 具有最高相等字符数量的位置获胜
    3. 通过将此等字符数除以目标中的字符总数获得百分比,您将获得百分比
    4. 如果百分比超过某个阈值,那就是匹配
    5. 第1步:

      最大行或列是搜索模式中的行或列总数减去目标模式中的行或列。

      int maxMatch = 0;
      int maxMatchRow = -1;
      int maxMatchColumn = -1;
      for (int row = 0; row <= searchRows - targetRows; row++) {
          for (int column = 0; columns <= searchColumns - targetColumns; column++) {
              int match = calculateMatch(search, target, row, column);
              if (match > maxMatch) {
                  maxMatchRow = row;
                  maxMatchColumn = column;
              }
          }
      }
      

      要计算方法calculateMatch中的匹配项,只需添加一个searchtarget中的字符相同(但添加偏移row和{{1}当您检查column时,而不是当您选中search

      我认为你应该能够从那里完成它。