基本上我想用正确拼写的单词替换不需要的重复字符单词

时间:2014-03-23 07:17:43

标签: java

我想将一个文本文件作为输入,阅读单词,用englishwordslist检查每个单词,如果单词拼写错误(如不需要的重复字符),则将该单词替换为同一文件中的正确单词。

如果单词是beautifullllll然后我的代码工作得很好..它写入文件漂亮但如果单词是beautttifulll那么我的代码将无法正常工作。首先我删除单词cross中的所有重复字符 - 检查单词列表如果不存在然后只允许一个连续重复的字符。因为beautttifulll有多个字符重复输出我得到的是beauttifull但它不在字典中。

请帮助我。

import java.io.*;

public class ownspell {
public static String result(String input, boolean doubleLetter){
    String pattern = null;
    if(doubleLetter) pattern = "(.)(?=\\1{2})";
    else pattern = "(.)(?=\\1)";
return input.replaceAll(pattern, "");
}
public static int checkingdic(String word) throws IOException,FileNotFoundException
{
      FileInputStream fstream=new FileInputStream("G:/englishwordslist.txt");
      DataInputStream in = new DataInputStream(fstream);
      BufferedReader br = new BufferedReader(new InputStreamReader(in));
      String sample=" ";
      word.toLowerCase();
      int flag=1;
      while((sample=br.readLine())!=null && flag==1)
       {
          if(sample.equalsIgnoreCase(word))
           { 
               flag=0;
           }
       }
      fstream.close();
      return flag;
}
public static void addtofile(String old,String newv) throws IOException , FileNotFoundException
{

    File file = new File("G:/1.txt");
    BufferedReader reader = new BufferedReader(new FileReader(file));
    String sample = "", oldtext = "";
    while((sample = reader.readLine()) != null)
        {
        oldtext += sample + "\r\n";
    }
    reader.close();
    // replace a word in a file
    String newtext = oldtext.replaceAll(old, newv);



    FileWriter writer = new FileWriter("G:/1.txt");
    writer.write(newtext);writer.close();

}
public static void main(String[] args) throws IOException , FileNotFoundException
{
    try{

        FileInputStream f1stream=new FileInputStream("G:/1.txt");
        DataInputStream in1 = new DataInputStream(f1stream);
        BufferedReader br1 = new BufferedReader(new    InputStreamReader(in1));
        String sample1=" ";
        while((sample1=br1.readLine())!=null)
        {
            String a[]=sample1.split(" ");
            for(int i=0;i<a.length;i++)
            {
                int flag;
            if(a[i].length()>0)
            {
                flag=checkingdic(a[i].toLowerCase());
                if(flag==0)
               {
                   System.out.println(a[i]+" :Word is found");
               }
               else
               {
                  // System.out.println(a[i]+" :Word is not found");
                   String output=result(a[i],false);
                   flag=checkingdic(output.toLowerCase());
                   if(flag==1)
                   {
                      output=result(a[i],true);
                      flag=checkingdic(output.toLowerCase());
                      if(flag==0)
                      {
                           addtofile(a[i],output);
                           System.out.println(a[i]+" :Word is found");
                      }
                      else
                      {   
                         System.out.println(a[i]+" :Word is not found");
                      }
                   }      
                   else
                   {
                      addtofile(a[i],output);
                      System.out.println(a[i]+" :Word is found");
                   }
                   }
               }            
            }
            }

      f1stream.close();
    }
    catch(Exception e)
    {
        System.out.println("Exception");
    }


}
}

前:

1.txt:这个boook是beautttifullll

期望输出:这本书很漂亮

输出此代码给出:本书是beautttifullll

它没有纠正单词beautttifullll,因为函数结果给出了beauttifull作为输出,因为它不在单词列表中。这个单词没有被纠正。

2 个答案:

答案 0 :(得分:0)

有趣的任务......我注意到你的代码包含

    word.toLowerCase();

我想你想要

    word = word.toLowerCase();

标准化两个文本字符串以进行比较。

您可以使用Pattern / Matcher进行文本更改(在类中编译Pattern而不是在运行时),或迭代每个子字符串字符 - 重复是位置x处的字符等于x + 1处的字符的位置 - 所以你可以知道在哪里删除一个角色。

答案 1 :(得分:0)

我的第一个想法是编写一个递归函数,删除一个字母并在世界不在词典中时自称。 它可以很好地用你的例子,但不适用于现实世界。

我解释说:在法语中你有“terrasse”这个词,所以我的问题是如果我写“terasse”或“terrrasssse”或“terrrase”,如何检测这个词。

马丁的回答让我想到了解决方案。

对于您词典中的每个单词,您都会关联一个正则表达式,该表达式可以检测一次或多次写入的所有字母。

回到我的例子:

对于“terrasse”,您生成(并且存储它 - 而不是在运行时)这样的正则表达式:

[开始] [ t (一次或多次)] [ e (一次或多次)] [ r (一个或多个)更多时间)] [ a (一次或多次)] [ s (一次或多次)] [ e (一次或多次) )] [end]的

所以你现在要做的就是滚动你的词典并查看一个表达式是否与你想要控制的词匹配

也许你可以加速服务器时间响应,只控制dictionnary中以你必须控制的世界第一个字母开头的单词。

希望它能帮到你......