Java实验--关于英文短语词语接龙

Posted halone

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java实验--关于英文短语词语接龙相关的知识,希望对你有一定的参考价值。

在课堂上经过实验之后,重新在宿舍里面从0开始编写大概30分钟左右能够完成这个实验,不是原来的思路。

该实验的表述为:从两个文本input1.txt和input2.txt中读取英文单词,若前面的英文单词的尾字母和后面的英文单词的未字母相同的话,则构成一个英文词语接龙,直到文章结尾,求出整篇文章中词语接龙最长的词语接龙词组,并将其输出到output1.txt和output2.txt文件夹中。

实验代码:

package ctn;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;

public class Ctn 

    static List<String> words=new ArrayList<String>();
    public static void main(String args[]) throws IOException
    
        words.clear();
        if(daoru("input1.txt"))
        
            int size=0;
            List<String> result = null;
            while(words.size()>0)
            
                List<String> temp=returnList(words);
                if(temp.size()>size)
                
                    result=temp;
                    size=temp.size();
                
            
            String all=new String();
            if(result.size()>1)
            
                for(String it:result)
                
                    all+=it+"\\r\\n";
                
                daochu(all,"output1.txt");
                System.out.println("文件output1.txt导出");
            
            else System.out.println("单词数量过少无法导出");
        
        else System.out.println("文件input1.txt不存在");
        
        words.clear();
        if(daoru("input2.txt"))
        
            int size=0;
            List<String> result = null;
            while(words.size()>0)
            
                List<String> temp=returnList(words);
                if(temp.size()>size)
                
                    result=temp;
                    size=temp.size();
                
            
            String all=new String();
            if(result.size()>1)
            
                for(String it:result)
                
                    all+=it+"\\r\\n";
                
                daochu(all,"output2.txt");
                System.out.println("文件output2.txt导出");
            
            else System.out.println("单词数量过少无法导出");
            words.clear();
        
        else System.out.println("文件input2.txt不存在");
    
    public static List<String> returnList(List<String> in)
    
        char cold=0;
        char cnew=0;
        List<String> temp=new ArrayList<String>();
        List<Integer> tempNum=new ArrayList<Integer>();
        for(int i=0;i<in.size();i++)
        
            String now=in.get(i);
            if(i==0)
            
                cold=now.charAt(now.length()-1);
                tempNum.add(i);
                temp.add(now);
                continue;
            
            cnew=now.charAt(0);
            if(cold==cnew)
            
                
                tempNum.add(i);
                if(!temp.contains(now))
                
                    temp.add(now);
                    cold=now.charAt(now.length()-1);
                
            
        
        for(int j=tempNum.size()-1;j>=0;j--)
        
            in.remove((int)tempNum.get(j));
        
        return temp;
    
    public static boolean daoru(String path) throws IOException
    
        
        File a=new File(path);
        if(!judeFileExists(a))
        
            System.out.println("文件不存在");
            return false;
        
        FileInputStream b = new FileInputStream(a);
        InputStreamReader c=new InputStreamReader(b,"UTF-8");
        
            BufferedReader bufr =new BufferedReader(c);
            String line = null;
            while((line = bufr.readLine())!=null)
                //line是每一行的数据
                
                String ook[]=line.split("[^A-Za-z]");
                for(String it:ook)
                
                    //it是每一个空格的数据
                    String temp=it.toLowerCase().replace("\\‘", "").replace(",", "").replace(".", "").replace(":", "").replace("!", "");
                    if(temp.length()>0)
                    words.add(temp);
                
                
            
            bufr.close();
        
        c.close();
        b.close();
        return true;
    
    //导入文件时判断文件存在
        public static boolean judeFileExists(File file) 

            if (file.exists()) 
                return true;
             else 
                return false;
            

        
        public static void daochu(String txt,String outfile) throws IOException
        
            File fi=new File(outfile);
            FileOutputStream fop=new FileOutputStream(fi);
            OutputStreamWriter ops=new OutputStreamWriter(fop,"UTF-8");
            ops.append(txt);
            ops.close();
            fop.close();
        

该实验过程中,对input1.txt输入飘的英文小说的第一章内容,输出output1.txt的时间响应应该在毫秒级以内。(单词量1W左右)

input2.txt输入飘的整本英文小说,输出output2.txt的时间在5分钟左右。(单词量10W左右)

技术图片

 

因此上述代码的算法对于数的运算过程响应的时间较长,推断是List中读取N个数据所耗费的时间太长,所以下面提供2种猜想用来提供解决:

猜想1.因为这个过程用到大量的随机读取,因此这里可以用Vector替代List,List在使用过程中多为大量的插入删除,这里插入删除相对较少。

实验代码:

package ctn;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import java.util.Vector;

public class Ctn1 

    static Vector<String> words=new Vector<String>();
    public static void main(String args[]) throws IOException
    
        words.clear();
        if(daoru("input1.txt"))
        
            int size=0;
            Vector<String> result = null;
            while(words.size()>0)
            
                Vector<String> temp=returnVector(words);
                if(temp.size()>size)
                
                    result=temp;
                    size=temp.size();
                
            
            String all=new String();
            if(result.size()>1)
            
                for(String it:result)
                
                    all+=it+"\\r\\n";
                
                daochu(all,"output1.txt");
                System.out.println("文件output1.txt导出");
            
            else System.out.println("单词数量过少无法导出");
        
        else System.out.println("文件input1.txt不存在");
        
        words.clear();
        if(daoru("input2.txt"))
        
            int size=0;
            Vector<String> result = null;
            while(words.size()>0)
            
                Vector<String> temp=returnVector(words);
                if(temp.size()>size)
                
                    result=temp;
                    size=temp.size();
                
            
            String all=new String();
            if(result.size()>1)
            
                for(String it:result)
                
                    all+=it+"\\r\\n";
                
                daochu(all,"output2.txt");
                System.out.println("文件output2.txt导出");
            
            else System.out.println("单词数量过少无法导出");
            words.clear();
        
        else System.out.println("文件input2.txt不存在");
    
    public static Vector<String> returnVector(Vector<String> in)
    
        char cold=0;
        char cnew=0;
        Vector<String> temp=new Vector<String>();
        Vector<Integer> tempNum=new Vector<Integer>();
        for(int i=0;i<in.size();i++)
        
            String now=in.get(i);
            if(i==0)
            
                cold=now.charAt(now.length()-1);
                tempNum.add(i);
                temp.add(now);
                continue;
            
            cnew=now.charAt(0);
            if(cold==cnew)
            
                
                tempNum.add(i);
                if(!temp.contains(now))
                
                    temp.add(now);
                    cold=now.charAt(now.length()-1);
                
            
        
        for(int j=tempNum.size()-1;j>=0;j--)
        
            in.remove((int)tempNum.get(j));
        
        return temp;
    
    public static boolean daoru(String path) throws IOException
    
        
        File a=new File(path);
        if(!judeFileExists(a))
        
            System.out.println("文件不存在");
            return false;
        
        FileInputStream b = new FileInputStream(a);
        InputStreamReader c=new InputStreamReader(b,"UTF-8");
        
            BufferedReader bufr =new BufferedReader(c);
            String line = null;
            while((line = bufr.readLine())!=null)
                //line是每一行的数据
                
                String ook[]=line.split("[^A-Za-z]");
                for(String it:ook)
                
                    //it是每一个空格的数据
                    String temp=it.toLowerCase().replace("\\‘", "").replace(",", "").replace(".", "").replace(":", "").replace("!", "");
                    if(temp.length()>0)
                    words.add(temp);
                
                
            
            bufr.close();
        
        c.close();
        b.close();
        return true;
    
    //导入文件时判断文件存在
        public static boolean judeFileExists(File file) 

            if (file.exists()) 
                return true;
             else 
                return false;
            

        
        public static void daochu(String txt,String outfile) throws IOException
        
            File fi=new File(outfile);
            FileOutputStream fop=new FileOutputStream(fi);
            OutputStreamWriter ops=new OutputStreamWriter(fop,"UTF-8");
            ops.append(txt);
            ops.close();
            fop.close();
        

在这里利用Vector方案后发现时间不仅没有缩短反倒延长了,在Vector的实验过程中,对input1.txt输入飘的英文小说的第一章内容,输出output1.txt的时间响应延长到2秒左右。(单词量1W左右)

input2.txt输入飘的整本英文小说,等待了8分钟之后还是没有输出output2.txt,所以没有必要再等待了(单词量10W左右),该猜想被否决,这里面用到插入删除比较频繁,所以List时间较短。

猜想2.用Map的键值对来存储英文数据

 //待续。。。

 

以上是关于Java实验--关于英文短语词语接龙的主要内容,如果未能解决你的问题,请参考以下文章

这次词语太专业了。求英文翻译。。。

程序员的算法趣题Q14: 国名接龙

空当接龙求解:java版广度优先

scratch成语接龙 电子学会图形化编程scratch等级考试四级真题和答案解析2021-9

Python 我输入一个词语,判断一段文字中有没有这个词语?

[词性] 十二介词 3