计算最长英语单词链

日期:2019.6.7

博客期:101

星期五

  

  经过了测试,我再一次的发现自己是有多么的菜鸡!唉~这么个破程序要写这么久,真是过分!我也是好久没写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
原文地址:https://www.cnblogs.com/onepersonwholive/p/10987806.html