n 你們常常玩成語接龍遊戲,咱們試一試英語的接龍吧:一個文本文件中有N 個不一樣的英語單詞, 咱們可否寫一個程序,快速找出最長的能首尾相連的英語單詞鏈,每一個單詞最多隻能用一次。最長的定義是:最多單詞數量,和單詞中字母的數量無關。java
n 例如, 文件裏有:app
Applespa
Zoo設計
Elephantcode
Underorm
Foxblog
Dog遊戲
Moonci
Leafrem
Tree
Pseudopseudohypoparathyroidism
n 最長的相連英語單詞串爲: apple - elephant – tree, 輸出到文件裏面,是這樣的:
Apple
Elephant
Tree
n 統一輸入文件名稱:input1.txt, input2.txt
n 統一輸出文件名稱:output1.txt,output2.txt
n 程序須要考慮下列異常情況:
n 例如,文件不存在,你的程序會崩潰麼,仍是能優雅地退出並給用戶提示信息?
n 若是文件沒有任何單詞、只有一個單詞、沒有能夠首尾相連的單詞,程序應該如何輸出?
n 若是輸入文件有一萬個單詞,你的程序能多快輸出結果?
要求將設計思想、代碼實現、實現截圖、我的總結以博文的形式發表。
設計思想:
將單詞存到list容器中,以後先獲取到第一個單詞的首、尾字母,以後再循環中獲取下一個單詞的首尾字母,讓第一個單詞的尾字母與第二個單詞的尾字母比較,若是相同,則將第二個單詞的首位字母賦值給第一個單詞的首位字母的變量,以此類推。
實驗代碼:
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Writer; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Scanner; public class Text_2 { static int N=5; static String b[]=new String[500]; public static void main(String[] args) { String sz=writeFromFile.readTxtFile("input3.txt"); String ltxt=null; if(sz==null) { System.out.println("找不到指定的文件"); } else if(sz=="kong") { System.out.println("文件爲空!"); } else { System.out.println(ltxt=StatList1(sz)); select(b); } try { writeFromFile.daochu(ltxt); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static int woor(String a) { int n=0; File ctoFile = new File("stopword.txt"); InputStreamReader rdCto; try { rdCto = new InputStreamReader(new FileInputStream(ctoFile)); BufferedReader bfReader = new BufferedReader(rdCto); String txtline = null; try { while ((txtline = bfReader.readLine()) != null) { if(txtline.equals(a)) { n=1; } } bfReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return n; } public static ArrayList<String> getFiles(String path) { ArrayList<String> files = new ArrayList<String>(); File file = new File(path); File[] tempList = file.listFiles(); for (int i = 0; i < tempList.length; i++) { if (tempList[i].isFile()) { files.add(tempList[i].toString()); } if (tempList[i].isDirectory()) { } } return files; } public static String StatList1(String str) { StringBuffer sb = new StringBuffer(); HashMap<String ,Integer> has = new HashMap<String ,Integer> (); // 打開一個哈希表 String[] slist = str.split("[^a-zA-Z\']+"); for (int i = 0; i < slist.length; i++) { if (!has.containsKey(slist[i])) { has.put(slist[i], 1); } else { has.put(slist[i],has.get(slist[i])+1 ); } } Iterator<String> iterator = has.keySet().iterator(); String a[]=new String[500]; int s[]=new int[500]; int judge; int n=400; for(int i=0;i<n;i++) { iterator = has.keySet().iterator(); while(iterator.hasNext()) { String word = (String) iterator.next(); if(s[i]<has.get(word)) { s[i]=has.get(word); a[i]=word; b[i]=word; } } judge=woor(a[i]); if(judge==1) { n++; has.remove(a[i]); } else { // System.out.println(a[i]+"6666"); // sb.append("單詞:").append(a[i]).append(" 次數").append(has.get(a[i])).append("\r\n"); has.remove(a[i]); } } return sb.toString(); } public static void select(String b[]) { List<Object> list=new ArrayList<>(); int q=0; int n0=0; for(int i=0;i<b.length;i++) { if(b[i]!=null) { n0++; } } if(n0==1) { System.out.println("只有一個單詞"); } else { String c="and"; q=c.length(); char n1=c.charAt(0); char n2=c.charAt(q-1); list.add(c); for(int j=0;j<b.length;j++) { String w=b[j]; if(w!=null) { int e=w.length(); char n3=w.charAt(0); char n4=w.charAt(e-1); if(n2==n3) { list.add(w); n1=n3; n2=n4; } } } String l=null; if(list.size()==1) { System.out.println("沒有首尾相連"); } else { for(int i=0;i<list.size();i++) { l=l+list.get(i)+"->"; System.out.println(list.get(i)+"->"); } try { daochu(l); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public static void daochu(String a) throws IOException { File file =new File("output1.txt"); Writer out =new FileWriter(file); String data=a; out.write(data); out.close(); } }
實驗截圖: