2013-07-31 57 views
1

我的问题是,我有一个输入文件,我必须重写文本,在没有4个单词(“a”),(“the” ),(“A”),(“The”)。我设法解决它为“a”和“the”,但不是为“A”和“The”。你可以帮我用我的代码吗?提前致谢。 下面是问题,输入我的代码:如何替换每个句子的第一个单词(来自输入文件)

问题:

英语,单词“一”和“”可大多是从句子删除,而不影响意义。这是一个压缩文本文件大小的机会!编写一个程序,逐行输入一个文本文件,并写出一个新的文本文件,其中每行删除了无用的单词。

首先编写一个简单版本的程序,用一个空格替换每行中的子字符串“a”和“the”。这将删除许多单词,但有时这些单词出现在行的开头或结尾,有时候这些单词以大写字母开头。所以,改善你的第一个程序,以便它也可以处理这些情况。

C:>的java移除< verbose.txt> terse.txt

注意:有String类的各种取代()方法,将简化该程序。尝试写这个程序而不使用它们。

输入文件:

一种新颖的是一个长的散文叙述,描述了虚构 人物和事件,通常以连续的故事的形式。 该体裁在中世纪和早期的现代浪漫和中篇小说传统领域具有历史根源。

代码:

import java.util.Scanner; 
import java.io.*; 

class File_Compressor 
{ 
public static void main(String[]args) throws IOException 
    { 
    int loc=0; 
    String line=""; 

    File input=new File ("input.txt"); 
    Scanner scan=new Scanner(input); 
    File output=new File("Hello2.java"); 
    PrintStream print=new PrintStream(output); 

    while (scan.hasNext()) 
     {line=scan.nextLine().trim(); 

      while(line.indexOf("A")>0||line.indexOf("The")>0||line.indexOf(" a")>0||line.indexOf(" the ")>0) 
    { 
    if (line.indexOf("A")>0) 
    {loc=line.indexOf("A"); 
    line=line.substring(loc+1);} 

    else if (line.indexOf("The")>0) 
    {loc=line.indexOf("The"); 
    line=line.substring(loc+3); 
     } 

    else if (line.indexOf(" a ")>0) 
    {loc=line.indexOf(" a "); 
    left=line.substring(0,loc+1); 
    right=line.substring(loc+2); 
    line=left+right;} 

    else if (line.indexOf(" the ")>0) 
    {loc=line.indexOf(" the "); 
    left=line.substring(0,loc+1); 
    right=line.substring(loc+4); 
    line=left+right;} 
    } 
    print.println(line); 
    } 
} 

}

+0

你允许重复使用那些_“类String”_的各种replace()方法的实现吗? ;) – Thomas

+0

另一个注意事项:不要只为''A'',''''和'“a”'查看,或者你可能从像Another,There等字词中删除这些子字符串。 – Thomas

回答

0

你的代码的一个小小的修改可能已经成功了。我没有仔细阅读它的机会,但你可以试试这个(扩大The等):

if (line.startsWith("A ")) { 
loc=line.indexOf("A "); 
line=line.substring(loc+2); 
} 

有几个假设,但:

  • 每一行都包含单句
  • 有只作为空白空间(无标签)

补充说明一下:你的内心,而条件应符合内部测试,即你应该看看为" a "而不是" a"

另一种选择是使用正则表达式通过PatternMatcher类,即自己实现String.replaceAll(...)的逻辑 - 如果允许的话。

+0

感谢托马斯,startsWith方法做到了!但是为什么我不能用substring和indexOf读第一个单词?我错过了什么? – user2561683

+0

@ user2561683你可以,但是你需要记住,如果你要查找的字符串在字符串的开头是正确的,那么'indexOf()'将返回0。因此在这里需要'indexOf(“A”)> = 0“(或者甚至'indexOf(”A“)== 0')与'startsWith()'一致。如果找不到字符串,则indexOf()将返回-1。 – Thomas

+0

谢谢,我明白了!所以如果我想使用indexOf(“A”),我应该写if(line.indexOf(“A”)> = 0)对不对? – user2561683

0

您应该使用hasSet类具有去除方法,所以我希望这个小例子可以帮助您

我的文字:

The a a dssfdsfd The a the an fdfdggth 
gtrfhtrht a the The fdsfddg 

我输出:

[fdfdggth, dssfdsfd, fdsfddg, gtrfhtrht] 

公共类deneme {

 private static HashSet<String> hS = new HashSet<String>();  

    public static void main(String[]args) throws IOException 
     { 
     int loc=0; 
     String line=""; 

     File input=new File ("C:\\deneme\\inputstack.txt"); 
     Scanner scanner=new Scanner(input); 
     File output=new File("Hello2.java"); 
     PrintStream print=new PrintStream(output); 


     while (scanner.hasNext()) { 
      if (scanner.hasNextDouble()) { 
       Double doubleValue = scanner.nextDouble(); 


      } 
      else { 

       String stringValue = scanner.next(); 
        hS.add(stringValue); 

        hS.remove("the"); 
        hS.remove("a"); 
        hS.remove("The"); 
        hS.remove("an");   

      } 

     } 

     System.out.println(hS); 
}  


} 
0

您可以在一个步骤正则表达式做到这一点。但我没有时间去创建一个表达式。抱歉。 但是,为了简单的任务,我使用apache commons lang。 在实际版本3.1中,您可以使用removeStartIgnoreCase方法找到类StringUtils,您可以使用它。

例子:

line = StringUtils.removeStartIgnoreCase(line,"a "); 
line = StringUtils.removeStartIgnoreCase(line,"the "); 

它的简单和清晰,我认为。 我的首选解决方案将包括将单词删除数组或类似的东西,然后遍历它们以从行首移除。

这里是链接到Apache Commons Lang中:

http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/index.html

http://commons.apache.org/proper/commons-lang/

+0

你应该添加“ “a”和“”,请参阅我对该问题的评论;) – Thomas

+0

然后执行它,它是您的项目。这只是你问题的一个简单例子。根据需要进行扩展。 –

+0

这不是_my_项目;),评论只是一个提示完整性(否则有人可能会抱怨说,它删除超过预期)。 – Thomas

1

既然你正在阅读的行的文件行,突破每行成文字的数组

line=scan.nextLine().trim(); 
String[] words = line.split("\\s+"); 
String sentence = ""; 
for (int i = 0; i < words.length; i++) { 
    if(!(words[i].equalsIgnoreCase("a") || words[i].equalsIgnoreCase("the"))){ 
     sentence += words[i] + " "; 
    } 
} 
System.out.println(sentence); 
相关问题