课堂练习01题目:计算最长英语单词链总结
一、题目内容:
大家经常玩成语接龙游戏,我们试一试英语的接龙吧:一个文本文件中有N 个不同的英语单词, 我们能否写一个程序,快速找出最长的能首尾相连的英语单词链,每个单词最多只能用一次。
最长的定义是:最多单词数量,和单词中字母的数量无关。
二、题目要求:
1、统一输入文件名称:input1.txt, input2.txt
2、统一输出文件名称:output1.txt,output2.txt
3、程序需要考虑下列异常状况:
(1)例如,文件不存在,你的程序会崩溃么,还是能优雅地退出并给用户提示信息?
(2)如果文件没有任何单词、只有一个单词、没有可以首尾相连的单词,程序应该如何输出?
(3)如果输入文件有一万个单词,你的程序能多快输出结果?
思路设计:
1、先构思程序步骤:导入文件、提取单词、提取单词首和尾、比较结果存储、导出最长链。
2、代码实现:
先利用
1 File f1 = new File("src/input3919.txt"); 2 BufferedReader br = new BufferedReader(new FileReader(f1)); 3 //定义个字符串用来保存每次读取的数据 4 String len; 5 StringBuffer sb = new StringBuffer(); 6 while ((len = br.readLine()) != null) { 7 // System.out.println(len); 8 sb.append(len);//将文件内容存入sb中 9 }
提取文件中的内容
然后利用
1 String str = sb.toString().toLowerCase(); 2 String[] strings = str.split("[^a-zA-Z\\']+");
对内容单词进行分割并统一大小写
随后利用substring函数进行首尾提取,比较并储存结果。利用.write()函数写入文件。
完成代码:
1 package com.text; 2 3 import org.omg.CORBA.WStringSeqHelper; 4 5 import java.io.*; 6 import java.util.ArrayList; 7 import java.util.Objects; 8 9 public class file4 { 10 public static void main(String[] args) throws Exception { 11 File file = new File("src/input3919.txt"); 12 if (file.exists() && file.length() == 0) { 13 System.out.println(" 文件为空!"); 14 System.exit(0); 15 } else if (achieve() == 1) { 16 System.out.println(" 文件只有一個單詞!"); 17 System.exit(0); 18 } else { 19 achieve(); 20 } 21 } 22 23 public static long achieve() throws Exception { 24 // ArrayList<String> list = new ArrayList<String>(); 25 ArrayList<String> list2 = new ArrayList<String>();//存储遍历结果 26 27 File f1 = new File("src/input3919.txt"); 28 BufferedReader br = new BufferedReader(new FileReader(f1)); 29 //定义个字符串用来保存每次读取的数据 30 String len; 31 StringBuffer sb = new StringBuffer(); 32 while ((len = br.readLine()) != null) { 33 // System.out.println(len); 34 sb.append(len);//将文件内容存入sb中 35 } 36 //不区分大小写 37 String str = sb.toString().toLowerCase(); 38 String[] strings = str.split("[^a-zA-Z\\']+"); 39 40 String tail, head, word; 41 long total = 1, max = 1; 42 43 for (int i = 0; i < Objects.requireNonNull(strings).length; i++) { 44 ArrayList<String> list1 = new ArrayList<String>();//存储遍历结果 45 total = 1; 46 47 word = strings[i]; 48 list1.add(word); 49 tail = word.substring(word.length() - 1); 50 51 //System.out.println(tail); 52 53 for (int j = i + 1; j < Objects.requireNonNull(strings).length; j++) { 54 word = strings[j]; 55 head = word.substring(0, 1); 56 //System.out.println(head); 57 58 if (tail.equals(head)) { 59 list1.add(word); 60 //System.out.println(total); 61 tail = word.substring(word.length() - 1); 62 total++; 63 } else { 64 // System.out.println(total); 65 if (total > max) 66 { 67 list2 = list1; 68 max = total; 69 } 70 break; 71 } 72 if(j == Objects.requireNonNull(strings).length - 1) 73 { 74 if (total > max) 75 { 76 list2 = list1; 77 max = total; 78 } 79 } 80 } 81 } 82 System.out.println(max); 83 84 File file = new File("src/output.txt"); 85 FileWriter out = new FileWriter(file); 86 for (int i = 0; i < list2.size(); i++) { 87 System.out.println(list2.get(i)); 88 out.write(list2.get(i) + " "); 89 } 90 br.close(); 91 out.close(); 92 return max; 93 } 94 }