我百度了一下如何讀寫文件:
html
File file = new File("D:\\20172328lxy\\20172328lxy\\src\\week_10\\homework\\text.txt"); Reader reader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(reader); String temp = bufferedReader.readLine();
File file2 = new File("D:\\20172328lxy\\20172328lxy\\src\\week_10\\homework\\ciphertext.txt"); Writer writer = new FileWriter(file2); writer.write(result1); writer.close();
這樣就實現了我預期中的第一步。從把字符集從文件中讀出來,並保存在一個數組characters[]裏面。git
《SECOND》:而後進行計算每個字符出現的頻率。首先用嵌套循環來實現,並把出現的機率存在另外一個數組中。真正地初次編完代碼,好的,全是0。我繼續改,知道在嵌套循環中邏輯沒有錯誤,可是全是0.0。
數組
這就讓我有點百思不得其解了,爲何邏輯沒有錯誤,但機率不出現,細細分析一遍,實際上是個人除法有問題,在"/"運算中,計算機會自動忽略後面的小數位,因此須要加(float)的操做才化腐朽爲神奇。。。(以下圖所示)
學習
double frequency[] = new double[27]; int numbers = 0;//空格的個數 for (int i = 0; i < characters.length; i++) { if (characters[i] == ' ') { numbers++; } frequency[26] = (float) numbers / characters.length; } System.out.println("字符集爲"); for (int j = 97; j <= 122; j++) { int number = 0;//給字母計數 for (int m = 0; m < characters.length; m++) { if (characters[m] == (char) j) { number++; } frequency[j - 97] = (float) number / characters.length; } System.out.print((char) j + ","); }
因而我先嚐試了一下,用了一個int型的變量加在了huffman樹的節點類的屬性中,可是出現的結果是:
測試
public class Node implements Comparable<Node> { private char data; private double weight; private Node left; private Node right; String codenumber;//這個就是保存0&1的變量 public Node(char data, double weight){ this.data = data; this.weight = weight; this.codenumber =""; }
//對英文文件進行編碼,輸出一個編碼後的文件 String result1 = ""; List<Node> temp1 = breadthFirstTraversal(root); for (int i = 0; i < characters.length; i++) { for (int j = 0; j < temp1.size(); j++) { if (characters[i] == temp1.get(j).getData()) { result1 += temp1.get(j).getCodenumber(); } } }
File file2 = new File("D:\\20172328lxy\\20172328lxy\\src\\week_10\\homework\\ciphertext.txt"); Writer writer = new FileWriter(file2); writer.write(result1); writer.close();
//對英文文件進行解碼,輸出一個解碼後的文件 //將全部具備字符的葉子節點從新保存在一個newlist裏面 List<String> newlist = new ArrayList<>(); for(int m=0;m < temp1.size();m++) { if(temp1.get(m).getData()!='無') newlist.add(String.valueOf(temp1.get(m).getData())); } System.out.println("字符:"+newlist); List<String> newlist1 = new ArrayList<>(); for(int m=0;m < temp1.size();m++) { if(temp1.get(m).getData()!='無') newlist1.add(String.valueOf(temp1.get(m).getCodenumber())); } System.out.println("對應編碼:"+newlist1); //先從編完碼的文件中讀出密文 FileReader fileReader = new FileReader("D:\\20172328lxy\\20172328lxy\\src\\week_10\\homework\\ciphertext.txt"); BufferedReader bufferedReader1 = new BufferedReader(fileReader); String secretline = bufferedReader1.readLine(); //將讀出的密文存在secretText列表中 List<String> secretText = new ArrayList<String>(); for (int i = 0; i < secretline.length(); i++) { secretText.add(secretline.charAt(i) + ""); } //解密 String result2 = "";//最後的解碼結果 String current="";// 臨時的保存值 while(secretText.size()>0) { current = current + "" + secretText.get(0); secretText.remove(0); for (int p = 0; p < newlist1.size(); p++) { if (current.equals(newlist1.get(p))) { result2 = result2 + "" + newlist.get(p); current=""; } } } System.out.println("解碼後的結果:"+result2); File file3 = new File("D:\\20172328lxy\\20172328lxy\\src\\week_10\\homework\\text1.txt"); Writer writer1 = new FileWriter(file3); writer1.write(result2); writer.close(); }