基于管道过滤器实现的kwic实现
生活随笔
收集整理的這篇文章主要介紹了
基于管道过滤器实现的kwic实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
KWIC索引系統(tǒng)接受一些行,每行有若干字,每個字由若干字符組成;每行都可以循環(huán)移位。重復地把第一個字刪除,然后接到行末; KWIC把所有行的各種移位情況按照字母表順序輸出。
在網(wǎng)上找了一個基于管道過濾器的實現(xiàn),但發(fā)現(xiàn)有好象錯誤,修改了一下使之正確,以下是代碼:
Filter類
package?com.jason.kwic;import?java.io.IOException;public?abstract?class?Filter?implements?Runnable?{//?定義輸入管道protected?Pipe?input;//?定義輸出管道protected?Pipe?output;private?boolean?isStart?=?false;Filter(Pipe?input,?Pipe?output)?{this.input?=?input;this.output?=?output;}//?防止多次調用,調用之后線程開始執(zhí)行public?void?start()?{if?(!isStart)?{isStart?=?true;Thread?thread?=?new?Thread(this);thread.start();}}//?線程的?run?方法public?void?run()?{try?{this.transform();}?catch?(IOException?e)?{e.getMessage();}}//?將輸入數(shù)據(jù)轉換為所需數(shù)據(jù)并寫入輸出管道//?由子類實現(xiàn)抽象方法protected?abstract?void?transform()?throws?IOException; }Pipe類
package?com.jason.kwic;import?java.io.IOException; import?java.io.PipedReader; import?java.io.PipedWriter; import?java.io.PrintWriter; import?java.util.Scanner;public?class?Pipe?{//輸入管道private?Scanner?pipereader;//輸出管道private?PrintWriter?pipewriter;public?Pipe(){PipedWriter?pw?=?new?PipedWriter();PipedReader?pr?=?new?PipedReader();try{pw.connect(pr);}?catch?(IOException?e){e.getMessage();}pipewriter?=?new?PrintWriter(pw);pipereader?=?new?Scanner(pr);}//讀入一行數(shù)據(jù)到管道//@return?讀入的數(shù)據(jù)public?String?readerLine()?throws?IOException{if?(pipereader.hasNextLine())?{return?pipereader.nextLine();}return?null;}//從管道輸出一行數(shù)據(jù)public?void?writerLine(String?strline)?throws?IOException{pipewriter.println(strline);}//將讀管道關閉,調用該方法后,不能再從管道中讀數(shù)據(jù)//如不能關閉則拋出異public?void?closeReader()?throws?IOException{pipereader.close();}//先刷新數(shù)據(jù),在將寫管道關閉,調用該方法后,不能向管道中寫數(shù)據(jù)//如不能關閉則拋出異常public?void?closeWriter()?throws?IOException{pipewriter.flush();pipewriter.close();} }Input類:
package?com.jason.kwic;import?java.io.File; import?java.io.IOException; import?java.util.Scanner;public?class?Input?extends?Filter{//輸入文件的文件名private?File?infile;Input(File?file,?Pipe?output){super(null,?output);this.infile?=?file;}@Override//讀取數(shù)據(jù)protected?void?transform()?throws?IOException?{Scanner?sc?=?new?Scanner(infile);String?templine?=?"";while(sc.hasNextLine()){templine?=?sc.nextLine();//System.out.println("Input:"?+?templine);output.writerLine(templine);}output.closeWriter();sc.close();} }Shift類:
package?com.jason.kwic;import?java.io.IOException; import?java.util.ArrayList; public?class?Shift?extends?Filter{//單詞的列表private?ArrayList<String>?wordlist?=?new?ArrayList<String>();//重組后的行的列表private?ArrayList<String>?linelist?=?new?ArrayList<String>();Shift(Pipe?input,?Pipe?output){super(input,?output);}@Overrideprotected?void?transform()?throws?IOException?{String?templine?=?"";//讀數(shù)據(jù)while((templine?=?input.readerLine())?!=?null){//將數(shù)據(jù)拆分為不同單詞this.lineSplitWord(templine);//將單詞重組為句子this.recombination();//輸出重組結果for(int?i?=?0;?i?<?linelist.size();?i++){//System.out.println("linelist:"?+?linelist.get(i));output.writerLine(linelist.get(i));}//清空wordlist、linelist和templinewordlist.clear();linelist.clear();templine?=?"";}input.closeReader();output.closeWriter();}//從一行中提取單詞存入單詞表中private?void?lineSplitWord(String?line){String?word?=?"";int?i?=?0;while(i?<?line.length()){if(line.charAt(i)?!=?'?'){word?+=?line.charAt(i);}else{wordlist.add(word);word?=?"";}i++;}if?(word.length()?>?0)?{wordlist.add(word);}}private?void?recombination(){for(int?j?=?0;?j?<?wordlist.size();?j++){String?templine?=?"";for?(int?k?=?wordlist.size()?-?1?-?j;?k?<?wordlist.size();?k++){templine?+=?wordlist.get(k)?+?"?";}for?(int?m?=?0;?m?<?wordlist.size()?-?1?-?j;?m++){if(m?!=?wordlist.size()?-?j?-?2){templine?+=?wordlist.get(m)?+?"?";}else{templine?+=?wordlist.get(m);}}linelist.add(templine);}} }Alphabetizer類:
package?com.jason.kwic;import?java.io.IOException; //import?java.text.Collator; import?java.util.ArrayList; import?java.util.Collections; import?java.util.Comparator; //import?java.util.Locale; public?class?Alphabetizer?extends?Filter{private?ArrayList<String>?al?=?new?ArrayList<String>();Alphabetizer(Pipe?input,?Pipe?output){super(input,?output);}//對讀入的數(shù)據(jù)進行排序protected?void?transform()?throws?IOException?{String?templine?=?null;//讀入數(shù)據(jù)while((templine?=?input.readerLine())?!=?null){al.add(templine);}//按字母表排序Collections.sort(al,?new?AlphaabetizerComparator());//對排序后的數(shù)據(jù)進行輸出for(int?i?=?0;?i?<?al.size();?i++){output.writerLine(al.get(i));}input.closeReader();output.closeWriter();}//使用java提供的Collator類來實現(xiàn)比較 //????private?class?AlphaabetizerComparator?implements?Comparator<String>?{ //???? //???? private?Collator?collator; //???? AlphaabetizerComparator(){ //???? this.collator?=?Collator.getInstance(Locale.ENGLISH); //???? } // // @Override // public?int?compare(String?o1,?String?o2)?{ // return?this.collator.compare(o1,?o2); // } //???? //????}//自己寫代碼實現(xiàn)比較(使用字母的ascii值來進行比較)private?class?AlphaabetizerComparator?implements?Comparator<String>?{@Overridepublic?int?compare(String?o1,?String?o2)?{if?(o1?==?null?||?o2?==?null)?{throw?new?NullPointerException();}int?compareValue?=?0;char?o1FirstCharacter?=?o1.charAt(0);char?o2FirstCharacter?=?o2.charAt(0);if(this.isLetter(o1FirstCharacter)?&&?this.isLetter(o2FirstCharacter))?{//如果是小寫的字母的值,則轉成對應的大寫的字母的值o1FirstCharacter?=?this.toUpperCase(o1FirstCharacter);o2FirstCharacter?=?this.toUpperCase(o2FirstCharacter);compareValue?=?o1FirstCharacter?-?o2FirstCharacter;}?else?{throw?new?RuntimeException("必須是字母");}return?compareValue;}private?boolean?isLetter(char?c)?{return?(c?>=?65?&&?c?<=?90)?||?(c?>=?97?&&?c?<=?122);}private?char?toUpperCase(char?c)?{if?(Character.isLowerCase(c))?{return?Character.toUpperCase(c);}return?c;}} }Output類:
package?com.jason.kwic;import?java.io.File; import?java.io.IOException; import?java.io.PrintWriter;public?class?Output?extends?Filter{//輸出文件的文件名private?File?file;Output(Pipe?input,?File?file){super(input,?null);this.file?=?file;}//輸出數(shù)據(jù)protected?void?transform()?throws?IOException?{PrintWriter?pw?=?new?PrintWriter(file);String?templine?=?"";while((templine?=?input.readerLine())?!=?null){pw.write(templine);pw.write("\n");}pw.flush();pw.close();input.closeReader();} }Main主程序
package?com.jason.kwic;import?java.io.File; import?java.util.Scanner;public?class?Main?{public?static?void?main(String[]?args)?{File?infile?=?new?File("d:\\temp\\mykwic_in.txt");File?outfile?=?new?File("d:\\temp\\mykwic_out.txt");Scanner?inputfile;Scanner?outputfile;try?{inputfile?=?new?Scanner(infile);outputfile?=?new?Scanner(outfile);//?定義三個管道Pipe?pipe1?=?new?Pipe();Pipe?pipe2?=?new?Pipe();Pipe?pipe3?=?new?Pipe();//?定義四種過濾器Input?input?=?new?Input(infile,?pipe1);Shift?shift?=?new?Shift(pipe1,?pipe2);Alphabetizer?alph?=?new?Alphabetizer(pipe2,?pipe3);Output?output?=?new?Output(pipe3,?outfile);//?啟動四種過濾器的線程 // input.start(); // shift.start(); // alph.start(); // output.start();//不啟用線程,順序執(zhí)行四個過濾器input.transform();shift.transform();alph.transform();output.transform();//?直接輸出結果System.out.println("-----??infile???-----");String?str?=?null;while?(inputfile.hasNextLine())?{str?=?inputfile.nextLine();System.out.println(str);}System.out.println("input??end");//啟用線程時要讓當前線程睡一段時間.//Thread.sleep(3000);System.out.println("-----??outfile??-----");while?(outputfile.hasNextLine())?{str?=?outputfile.nextLine();System.out.println(str);}inputfile.close();outputfile.close();}?catch?(Exception?e)?{//?e.getMessage();e.printStackTrace();}} }注意其中的infile和outfile對應的路徑要修改成實際的路徑,并且必須存在這兩個文件。
轉載于:https://my.oschina.net/u/914897/blog/408947
總結
以上是生活随笔為你收集整理的基于管道过滤器实现的kwic实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Arduino Uno 蜂鸣器播放《天
- 下一篇: 梁漱溟:做学问的八层境界