700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 主程序-子程序 面向对象 事件系统和管道-过滤软件体系结构实现KWIC

主程序-子程序 面向对象 事件系统和管道-过滤软件体系结构实现KWIC

时间:2018-10-10 13:07:09

相关推荐

主程序-子程序 面向对象 事件系统和管道-过滤软件体系结构实现KWIC

KWIC(Key Word In Context),Parnas (1972)索引系统

KWIC索引系统接受一些行,每行有若干字,每个字由若干字符组成;每行都可以循环移位,亦即重复地把第一个字删除,然后接到行末; KWIC把所有行的各种移位情况按照字母表顺序输出(不考虑大小写)。

输入:若干行字符语句

The sun is rising in the eastFlowers are blooming

中间过程:循环移位后形成下面的结果

The sun is rising in the east sun is rising in the east the is rising in the east the sunrising in the east the sun isin the east the sun is risingthe east the sun is rising ineast the sun is rising in theFlowers are bloomingare blooming Flowers blooming Flowers are

输出:排序后的结果

are blooming Flowers blooming Flowers areeast the sun is rising in theFlowers are bloomingin the east the sun is risingis rising in the east the sunrising in the east the sun issun is rising in the east thethe east the sun is rising inThe sun is rising in the east

四种软件体系结构化实现

一、主程序-子程序软件体系结构:

public class demo1 {private ArrayList<String> kwicList = new ArrayList<String>();private ArrayList<String> lineTxt = new ArrayList<String>();private BufferedReader inputFile;private BufferedWriter outputFile;public static void main(String[] args) {demo1 kwic = new demo1();kwic.input("E:\\input.txt");kwic.shift();kwic.alphabetizer();kwic.output("E:\\output.txt");}public void input(String fileName) {try {inputFile = new BufferedReader(new FileReader(fileName));} catch (Exception e) {e.printStackTrace();}String line;try {while ((line = inputFile.readLine()) != null) {lineTxt.add(line);}} catch (IOException e) {e.printStackTrace();}}public void output(String filename){Iterator<String> it = kwicList.iterator();try {outputFile = new BufferedWriter(new FileWriter(filename));while (it.hasNext()) {outputFile.write(it.next()+"\n");}}catch (IOException e){e.printStackTrace();}finally {try {if (outputFile!=null) {outputFile.close();}} catch (IOException e) {e.printStackTrace();}}}public void shift() {//获取每个单词,存入tokensIterator<String> it = lineTxt.iterator();while (it.hasNext()) {StringTokenizer token = new StringTokenizer(it.next());ArrayList<String> tokens = new ArrayList<String>();int i = 0;//循环添加单词int count = token.countTokens();while (i < count) {tokens.add(token.nextToken());i++;}//display(tokens);//切割各个单词,不断改变起始值和利用loop实现位移。for (i = 0; i < count; i++) {StringBuffer lineBuffer = new StringBuffer();int index = i;for (int f = 0; f < count; f++) {//从头继续位移if (index >= count)index = 0;//存入StringBufferlineBuffer.append(tokens.get(index));lineBuffer.append(" ");index++;}String tmp = lineBuffer.toString();kwicList.add(tmp);}}}public void alphabetizer() {Collections.sort(this.kwicList, new AlphabetizerComparator());}private class AlphabetizerComparator implements Comparator<String> {@Overridepublic int compare(String o1, String o2) {if (o1 == null && o2 == null) {throw new NullPointerException();}int compareValue = 0;char o1c = o1.toLowerCase().charAt(0); //忽略大小写char o2c = o2.toLowerCase().charAt(0); //忽略大小写compareValue = o1c - o2c;return compareValue;}}}

二、面向对象软件体系结构

Input类

public class Input {private ArrayList<String> lineTxt = new ArrayList<String>();public ArrayList<String> getLineTxt() {return lineTxt;}public void input(String fileName) {BufferedReader inputFile = null;try {inputFile = new BufferedReader(new FileReader(fileName));} catch (Exception e) {e.printStackTrace();}String line;try {while ((line = inputFile.readLine()) != null) {lineTxt.add(line);}} catch (IOException e) {e.printStackTrace();}}}

Shift类

public class Shift {private ArrayList<String> kwicList = new ArrayList<String>();private ArrayList<String> lineTxt;public Shift( ArrayList<String> lineTxt) {this.lineTxt = lineTxt;}public ArrayList<String> getKwicList() {return kwicList;}public ArrayList<String> getLineTxt() {return lineTxt;}public void shift() {//获取每个单词,存入tokensIterator<String> it = lineTxt.iterator();while (it.hasNext()) {StringTokenizer token = new StringTokenizer(it.next());ArrayList<String> tokens = new ArrayList<String>();int i = 0;//循环添加单词int count = token.countTokens();while (i < count) {tokens.add(token.nextToken());i++;}//display(tokens);//切割各个单词,不断改变起始值和利用loop实现位移。for (i = 0; i < count; i++) {StringBuffer lineBuffer = new StringBuffer();int index = i;for (int f = 0; f < count; f++) {//从头继续位移if (index >= count)index = 0;//存入StringBufferlineBuffer.append(tokens.get(index));lineBuffer.append(" ");index++;}String tmp = lineBuffer.toString();kwicList.add(tmp);}}}}

Alphabetizer类

public class Alphabetizer {private ArrayList<String> kwicList;public Alphabetizer(ArrayList<String> kwicList) {this.kwicList = kwicList;}public ArrayList<String> getKwicList() {return kwicList;}public void sort() {Collections.sort(this.kwicList, new AlphabetizerComparator());}private class AlphabetizerComparator implements Comparator<String> {@Overridepublic int compare(String o1, String o2) {if (o1 == null && o2 == null) {throw new NullPointerException();}int compareValue = 0;char o1c = o1.toLowerCase().charAt(0); //忽略大小写char o2c = o2.toLowerCase().charAt(0); //忽略大小写compareValue = o1c - o2c;return compareValue;}}}

Output类

public class Output {private ArrayList<String> kwicList;private BufferedWriter outputFile;public Output(ArrayList<String> kwicList) {this.kwicList = kwicList;}public void output(String filename){Iterator<String> it = kwicList.iterator();try {outputFile = new BufferedWriter(new FileWriter(filename));while (it.hasNext()) {outputFile.write(it.next()+"\n");}}catch (IOException e){e.printStackTrace();}finally {try {if (outputFile!=null) {outputFile.close();}} catch (IOException e) {e.printStackTrace();}}}}

Main类

public class Main {public static void main(String[] args) {Input input = new Input();input.input("E:\\input.txt");Shift shift = new Shift(input.getLineTxt());shift.shift();Alphabetizer alphabetizer = new Alphabetizer(shift.getKwicList());alphabetizer.sort();Output output = new Output(alphabetizer.getKwicList());output.output("E:\\output.txt");}}

三、事件系统软件体系结构

以观察者模式为例

Subject抽象主题类

public class Subject {//观察者数组private List<Observer> vector = new LinkedList<>();//增加一个观察者public void addObserver(Observer observer) {vector.add(observer);}//删除一个观察者public void deleteObserver(Observer observer) {vector.remove(observer);}//通知所有观察者public void notifyAllObserver() {for(Observer observer : vector) {observer.toDo();}}// 通知特定观察者public void notifyOneObserver(int i) {vector.get(i).toDo();}}

KWIC具体主题类

public class KWICSubject extends Subject{public void startKWIC(){for (int i = 0;i<3;i++){super.notifyOneObserver(i);}}}

Observer抽象观察者类

public interface Observer {void toDo();}

Input 观察者类

public class Input implements Observer{private ArrayList<String> lineTxt = new ArrayList<String>();public ArrayList<String> getLineTxt() {return lineTxt;}private String fileName;public Input(String fileName) {this.fileName = fileName;}@Overridepublic void toDo() {BufferedReader inputFile = null;try {inputFile = new BufferedReader(new FileReader(fileName));} catch (Exception e) {e.printStackTrace();}String line;try {while ((line = inputFile.readLine()) != null) {lineTxt.add(line);}} catch (IOException e) {e.printStackTrace();}}}

Shift观察者类

public class Shift implements Observer {private ArrayList<String> kwicList = new ArrayList<String>();private ArrayList<String> lineTxt;public Shift( ArrayList<String> lineTxt) {this.lineTxt = lineTxt;}public ArrayList<String> getKwicList() {return kwicList;}public ArrayList<String> getLineTxt() {return lineTxt;}@Overridepublic void toDo() {//获取每个单词,存入tokensIterator<String> it = lineTxt.iterator();while (it.hasNext()) {StringTokenizer token = new StringTokenizer(it.next());ArrayList<String> tokens = new ArrayList<String>();int i = 0;//循环添加单词int count = token.countTokens();while (i < count) {tokens.add(token.nextToken());i++;}//display(tokens);//切割各个单词,不断改变起始值和利用loop实现位移。for (i = 0; i < count; i++) {StringBuffer lineBuffer = new StringBuffer();int index = i;for (int f = 0; f < count; f++) {//从头继续位移if (index >= count)index = 0;//存入StringBufferlineBuffer.append(tokens.get(index));lineBuffer.append(" ");index++;}String tmp = lineBuffer.toString();kwicList.add(tmp);}}}}

Alphabetizer 观察者类

public class Alphabetizer implements Observer {private ArrayList<String> kwicList;public Alphabetizer(ArrayList<String> kwicList) {this.kwicList = kwicList;}public ArrayList<String> getKwicList() {return kwicList;}@Overridepublic void toDo() {Collections.sort(this.kwicList, new AlphabetizerComparator());}private class AlphabetizerComparator implements Comparator<String> {@Overridepublic int compare(String o1, String o2) {if (o1 == null && o2 == null) {throw new NullPointerException();}int compareValue = 0;char o1c = o1.toLowerCase().charAt(0); //忽略大小写char o2c = o2.toLowerCase().charAt(0); //忽略大小写compareValue = o1c - o2c;return compareValue;}}}

Output观察类

public class Output implements Observer {private ArrayList<String> kwicList;private BufferedWriter outputFile;private String filename;public Output(ArrayList<String> kwicList,String filename) {this.kwicList = kwicList;this.filename = filename;}@Overridepublic void toDo(){Iterator<String> it = kwicList.iterator();try {outputFile = new BufferedWriter(new FileWriter(filename));while (it.hasNext()) {outputFile.write(it.next()+"\n");}}catch (IOException e){e.printStackTrace();}finally {try {if (outputFile!=null) {outputFile.close();}} catch (IOException e) {e.printStackTrace();}}}}

测试类

public class Main {public static void main(String[] args) {//创建主题KWICSubject kwicSubject = new KWICSubject();//创建观察者Input input = new Input("E:\\input.txt");Shift shift = new Shift(input.getLineTxt());Alphabetizer alphabetizer = new Alphabetizer(shift.getKwicList());Output output = new Output(alphabetizer.getKwicList(), "E:\\output.txt");// 将观察者加入主题kwicSubject.addObserver(input);kwicSubject.addObserver(shift);kwicSubject.addObserver(alphabetizer);kwicSubject.addObserver(output);// 逐步调用各个观察者kwicSubject.startKWIC();}}

四、管道-过滤软件体系结构

Pipe管道类

public class Pipe {private Scanner pipeReader;private PrintWriter pipeWriter;Pipe(){PipedWriter pipedWriter = new PipedWriter();PipedReader pipedReader = new PipedReader();try {pipedWriter.connect(pipedReader);} catch (IOException e) {e.printStackTrace();}pipeReader = new Scanner(pipedReader);pipeWriter = new PrintWriter(pipedWriter);}public String readerLine(){return pipeReader.nextLine();}public boolean hashNextLine(){return pipeReader.hasNext();}public void writerLine(String strLine){pipeWriter.println(strLine);}public void closeReader(){pipeReader.close();}public void closeWriter(){pipeWriter.close();}}

Filter抽象类

public abstract class Filter {protected Pipe input;protected Pipe output;public Filter(Pipe input, Pipe output) {this.input = input;this.output = output;}protected abstract void transform() throws IOException;}

Input输入过滤器类

public class Input extends Filter {private File file;public Input(File file,Pipe output) {super(null, output);this.file = file;}@Overrideprotected void transform() throws IOException {BufferedReader inputFile = null;try {inputFile = new BufferedReader(new FileReader(file));} catch (Exception e) {e.printStackTrace();}String line;try {while ((line = inputFile.readLine()) != null) {output.writerLine(line);}} catch (IOException e) {e.printStackTrace();}output.closeWriter();}}

Shift单词移位过滤器类

public class Shift extends Filter {public Shift(Pipe input, Pipe output) {super(input, output);}@Overrideprotected void transform() throws IOException {//获取每个单词,存入tokenswhile (input.hashNextLine()) {StringTokenizer token = new StringTokenizer(input.readerLine());ArrayList<String> tokens = new ArrayList<String>();int i = 0;//循环添加单词int count = token.countTokens();while (i < count) {tokens.add(token.nextToken());i++;}//display(tokens);//切割各个单词,不断改变起始值和利用loop实现位移。for (i = 0; i < count; i++) {StringBuffer lineBuffer = new StringBuffer();int index = i;for (int f = 0; f < count; f++) {//从头继续位移if (index >= count)index = 0;//存入StringBufferlineBuffer.append(tokens.get(index));lineBuffer.append(" ");index++;}String tmp = lineBuffer.toString();output.writerLine(tmp);}}input.closeReader();output.closeWriter();}}

Alphabetizer排序过滤器类

public class Alphabetizer extends Filter {private ArrayList<String> kwicList = new ArrayList<>();public Alphabetizer(Pipe input, Pipe output) {super(input, output);}@Overrideprotected void transform() throws IOException {while (input.hashNextLine()){kwicList.add(input.readerLine());}Collections.sort(this.kwicList, new AlphabetizerComparator());for (String line:kwicList){output.writerLine(line);}input.closeReader();output.closeWriter();}private class AlphabetizerComparator implements Comparator<String> {@Overridepublic int compare(String o1, String o2) {if (o1 == null && o2 == null) {throw new NullPointerException();}int compareValue = 0;char o1c = o1.toLowerCase().charAt(0); //忽略大小写char o2c = o2.toLowerCase().charAt(0); //忽略大小写compareValue = o1c - o2c;return compareValue;}}}

Output输出过滤器类

public class Output extends Filter {private File file;public Output(File file,Pipe input) {super(input, null);this.file = file;}@Overrideprotected void transform() throws IOException {BufferedWriter outputFile =null;String line;try {outputFile = new BufferedWriter(new FileWriter(file));while (input.hashNextLine()) {outputFile.write(input.readerLine()+"\n");}}catch (IOException e){e.printStackTrace();}finally {try {if (outputFile!=null) {outputFile.close();}} catch (IOException e) {e.printStackTrace();}}input.closeReader();}}

Main类

public class Main {public static void main(String[] args) throws IOException {File inFile = new File("E:\\input.txt");File outFile = new File("E:\\output.txt");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 alphabetizer = new Alphabetizer(pipe2, pipe3);Output output = new Output(outFile,pipe3);input.transform();shift.transform();alphabetizer.transform();output.transform();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。