计算最长英语单词链

Posted onepersonwholive

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算最长英语单词链相关的知识,希望对你有一定的参考价值。

日期:2019.6.7

博客期:085

星期五

  技术图片

 

  经过了测试,我再一次的发现自己是有多么的菜鸡!唉~这么个破程序要写这么久,真是过分!我也是好久没写Java程序,手生了!

  好了,说程序,这一个程序的最大限度是在文件的单词数不超过Integer的MAX值个,就可以运行了,也就是说大约24000000个单词,我测试的文件是1200000多行,直接报内存溢出了,我也明白是怎么回事!给大家看看我的代码。

  代码上有注释,大家应该都看得懂!

  

技术图片
 1 package basic;
 2 
 3 import java.io.File;
 4 import java.io.PrintWriter;
 5 import java.util.ArrayList;
 6 import java.util.List;
 7 import java.util.Scanner;
 8 
 9 public class FileReaderToMakeGroup 
10     //把最长的结果输出到文件中
11     public static void makeListIntoFiles(List<String>list,String file)
12         File f = new File(file);
13         try 
14             if(!f.exists())
15             
16                 System.out.println("输出文件不存在!");
17                 f.createNewFile();
18             
19             PrintWriter pw = new PrintWriter(f);
20             
21             int leng = list.size();
22             
23             for(int i=0;i<leng;++i)
24             
25                 String str = list.get(i);
26                 if(str.charAt(str.length()-1)==‘-‘||str.charAt(str.length()-1)==‘—‘)
27                     str = str.substring(0,str.length()-1);
28                 pw.println(str);
29             
30             
31             pw.close();
32          catch (Exception e) 
33             return;
34         
35     
36     //处理输入文件,将处理的文件导入成单词数组
37     public static List <String> makeDealWith(String file)
38         
39         List <String> list = new ArrayList<String>();            //要返回的数组
40         File f = new File(file);
41         Scanner sc = null;
42         try 
43             if(!f.exists())
44                 f.createNewFile();                                //文件不存在,进行处理
45             sc = new Scanner(f);
46             while(sc.hasNext())
47             
48                 String s = sc.next().toLowerCase();                //将单词字符串转为小写
49                 
50                 if(isContainsUnableChar(s))                        //判断有特殊字符,将特殊字符去掉
51                     s = dealAndGetSpecific(s);
52                 
53                 if(s.compareTo("")==0)                            //如果删除后就只有空字符串了
54                     continue;
55                 
56                 /*
57                 if(!listContain(list,s))                        //如果字符串重复了
58                     list.add(s);
59                 */
60                 
61                 if(s.charAt(s.length()-1)==‘-‘)                    //去掉末尾是-的情况
62                     s.replace("-","");
63             
64          catch (Exception e) 
65             System.out.println("输入文件不存在!");
66             return list;
67         
68         sc.close();
69         return list;
70     
71     //展示文件的内容到页面
72     public static void makeFileIntoView(List<String>list)
73         int leng = list.size();
74         for(int i=0;i<leng;++i)
75             System.out.println(list.get(i));
76     
77     //判断是否为含有非单词字符
78     public static boolean isContainsUnableChar(String str)
79         return str.contains(",")||str.contains(".")||str.contains("?")||str.contains(";")||str.contains(":")||str.contains("”")||str.contains("!")||str.contains("“")||str.contains("’")||str.contains("‘");
80     
81     //将非单词字符删掉
82     public static String dealAndGetSpecific(String str)
83         return str.replace(",","").replace(".","").replace(";","").replace("?","").replace(":","").replace("!","").replace("”","").replace("“","").replace("’","").replace("‘","");
84     
85     //判断表内是否存在str
86     public static boolean listContain(List <String> list_str,String str)
87         if(list_str==null||str==null)
88             return false;
89         else if(list_str.size()==0||str.length()==0)
90             return false;
91         int leng = list_str.size();
92         for(int i=0;i<leng;++i)
93             if(list_str.get(i).compareTo(str)==0)
94                 return true;
95         return false;
96     
97 
FileReaderToMakeGroup.java

 

技术图片
 1 package basic;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 public class TestForMainInString 
 7     //对于相应的文件做处理
 8     public static void makeOutputInputFiles(String inputFile,String outputFile)
 9         
10         List <String> final_list = new ArrayList<String>();
11         
12         List <String> list = FileReaderToMakeGroup.makeDealWith(inputFile);
13         
14         //FileReaderToMakeGroup.makeFileIntoView(list);
15         
16         int leng = list.size();
17         
18         if(leng==0)
19         
20             System.out.println("输入文件为空!");
21             return;
22         
23         else if(leng==1)
24             System.out.println("只有一个单词!");
25         
26         boolean [] hasUsed = new boolean [leng];    //记录是否被编辑
27         
28         for(int i=0;i<leng-final_list.size();++i)    //循环做减法——直至不能再有更长的内容出现
29         
30             hasUsed[i] = false;
31         
32         
33         for(int i=0;i<leng;++i)
34         
35             if(!hasUsed[i])
36             
37                 hasUsed[i] = true;
38                 List <String> plist = new ArrayList<String>();                //存储以当前开头的所有首尾相连的最大字符串组合
39                 
40                 char c;
41                 
42                 if(list.get(i).length()!=0)
43                     c = list.get(i).charAt(list.get(i).length()-1);            //对初始字符进行判定
44                 else
45                     continue;
46                 
47                 plist.add(list.get(i));
48                 
49                 for(int j=i+1;j<leng;++j)
50                 
51                     String pstr = list.get(j);
52                     if(pstr.length()!=0)
53                     
54                         //如果字符串符合要求且不重复就做规整
55                         if(c==pstr.charAt(0)&&!FileReaderToMakeGroup.listContain(plist, pstr))        
56                         
57                             plist.add(pstr);
58                             c = pstr.charAt(pstr.length()-1);                
59                             hasUsed[j] = true;
60                         
61                     
62                 
63                 if(plist.size()>=final_list.size())                    //找寻长度最长的词语接龙
64                     final_list = plist;
65             
66         
67         
68         FileReaderToMakeGroup.makeListIntoFiles(final_list, outputFile);        //把文件写入到outputFile下
69         
70         if(leng!=0&&final_list.size()==1)
71         
72             System.out.println("没有首尾相连的单词!");        //判定没有首尾相连的单词
73         
74         
75         //FileReaderToMakeGroup.makeListIntoFiles(list, "txtFiles/output3.txt");
76     
77     public static void main(String[] args) 
78         String inputFileName = "txtFiles/input3.txt";
79         String outputFileName = "txtFiles/output4.txt";
80         makeOutputInputFiles(inputFileName,outputFileName);
81     
82 
TestForMainInString.java

 

以上是关于计算最长英语单词链的主要内容,如果未能解决你的问题,请参考以下文章

成语接龙(英语单词链)

单词接龙最长——6.6

只包含一个元音字母的最长的英语单词是哪个?

第十六周 项目4--英语单词的基数排序

第十六周 项目4--英语单词的基数排序

C++编程问题?输入一个英语句子,输出其中最长的单词,并输出次单词的位置。