日期: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
原文地址:https://www.cnblogs.com/onepersonwholive/p/10987806.html
时间: 2024-10-30 11:03:59