如何将我的模式排序与完全匹配,半匹配等结果匹配

时间:2012-11-07 16:41:14

标签: java sorting

  

可能重复:
  Regular expression not matching subwords in phrase

我的程序显示匹配的结果,但我想将结果排序为完全匹配(100%),半匹配等等。 我的文本文件包含以下行:

  1. 红车

  2. 红色

  3. 汽车

  4. 所以如果我搜索:“红色汽车”。我得到以下结果

    1. 红车

    2. 红色

    3. 汽车

    4. 所以我想要做的是按如下方式对找到的结果进行排序:

      1. “红车”100%匹配

      2. “红色”40%匹配

      3. “car”40%匹配

      4. 感谢任何帮助。

        感谢任何帮助。我的代码如下:

        public static void main(String[] args) {
          // TODO code application logic here
          String strLine;
          try{
            // Open the file that is the first 
            // command line parameter   
            FileInputStream fstream = new FileInputStream("C:\\textfile.txt"");
            // Get the object of DataInputStream
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
        
            Scanner input  = new Scanner (System.in);         
            System.out.print("Enter Your Search:  ");   // String key="red or yellow";
            String key = input.nextLine();
        
            while ((strLine = br.readLine()) != null) {     
              Pattern p = Pattern.compile(key); // regex pattern to search for
              Matcher m = p.matcher(strLine);  // src of text to search
              boolean b = false;
              while(b = m.find()) {                       
                System.out.println( " " + m.group()); // returns index and match
                // Print the content on the console
              }
            }
            //Close the input stream
            in.close();              
          }catch (Exception e){//Catch exception if any
            System.err.println("Error: " + e.getMessage());
          }
        }  
        

1 个答案:

答案 0 :(得分:0)

假设您正在搜索“红色”或“黄色”,或者是您需要的唯一逻辑运算符(没有'和'或'xor'),并且您不希望使用任何通配符或正则表达式你搜索的是什么,然后我会简单地循环,尝试依次匹配每个字符串。在伪代码中,类似于:

foreach (thisLine: allLinesInTheFile) {
    numOfCharsMatching = 0
    foreach (thisString: allSearchStrings) {
         if (thisLine.contains(thisString) {
               numOfCharsMatching = numOfCharsMatching + thisString.length
         }
    }
    score = ( numOfCharsMatching / thisLine.length ) * 100
}

如果您不想在分数中计算空格,那么您需要从thisString.length中删除它们(并且不允许在搜索词中使用它们)

另一个问题是如果匹配可以重叠,则numOfCharsMatching将是不正确的(即,如果在'brown row'中搜索'row'或'brown',则会说有11个字符匹配,长于字符串的长度您可以使用BitSet跟踪匹配中涉及的字符,如:

foreach (thisLine: allLinesInTheFile) {
    whichCharsMatch = new BitSet()
    foreach (thisString: allSearchStrings) {
         if (thisLine.contains(thisString) {
               whichCharsMatch.set(startPositionOfMatch, endPositionOfMatch, true)
         }
    }
    score = ( numOfCharsMatching / thisLine.length ) * 100
}

查看BitSet javadoc,特别是set和基数方法