1、题前分析

kwic是什么到低要解决什么问题?


看这段英文的变化,输入的值的是绿色圈出的部分,第一次处理后的结果是橙色圈出的部分,第三次处理的结果是红色圈出的部分,第一次处理,先是对句话进行了切分,是按照单词之间的空格进行切分,将一整句话切分成多个单词,然后对这些单词的进行移位,每次都将第一个单词放在末尾从而组成新的句子,这样经过第一次处理之后,HELLO WORLD 这句话就变成了两句话HELLO WORLD 和WORLD HELLO。接下来进行第二步处理,对这几句话按照首字母进行排序,从而得到最终的结果。

2、管道过滤器风格
实现代码如下
第一版:(具体的思路看代码的注释)

package com.bren.cn;import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;/*** * @author huihui 基于管道过滤器模式,这是第一版*/
public class mypip {/*** 第一步我应该有一个管道 我需要导入java的管道流的包* @throws IOException */public static void main(String[] args) throws IOException {/*** 输入管道流*/    PipedInputStream inPip;PipedOutputStream outPip;/*** 管道相连*/inPip= new PipedInputStream();outPip = new PipedOutputStream();try {inPip.connect(outPip);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}/*** 第二步我需要向管道中读入数据"Hello Yolo I  am Boss"*/byte[] out = new byte[1024];byte[] in = new byte[1024];String s = new String("hello yolo i  am boss");//这里我可以按行读取一个外部的文件outPip.write(s.getBytes());//向管道中写入数据 outPip.close();/*** 第三步我需要使用过滤器对管道中的数据进行切分* 1、先拿取管道中的数据* 2、进行切分移位之后再放回管道中*/int len = 0;len=inPip.read(in);//从管道中拿取数据s = new String(in, 0, len);//得到字符串sinPip.close();//1、切分StringTokenizer tokener = new StringTokenizer(s," ");//2、进行移位操作String token = new String(); int index; ArrayList<String> tokens = new ArrayList<String>(); int count = tokener.countTokens(); for (int j = 0; j < count; j++) {//将一行解析,并且将解析的word加入ArrayList中 token = tokener.nextToken(); tokens.add(token); }ArrayList<String> kwicList = new ArrayList<String>();//对ArrayList中的字进行循环移位,得出最后结果 for (int i = 0; i < count; i++) { index=i; StringBuffer linebuffer = new StringBuffer(); for (int j = 0; j < count; j++) { if (index >= count) index = 0; linebuffer.append ( tokens.get(index)  ); linebuffer.append (" "); index++; }String line = linebuffer.toString(); kwicList.add(line); }/*** 3、移位之后再次写入到管道中,进行下一个过滤器*/PipedInputStream inPip2;PipedOutputStream outPip2;/*** 管道相连*/inPip2= new PipedInputStream();outPip2 = new PipedOutputStream();try {inPip2.connect(outPip2);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}String s1="";for (int count1 = 0; count1 < kwicList.size(); count1++) {s1 =s1+kwicList.get (count1)+"\n";}System.out.println(s1);outPip2.write(s1.getBytes());outPip2.close();/*** 4、再次读取管道中的数据、进行首字母排序处理,按照换行符读取形成字符串数组*/System.out.println("输出in"+in[0]);len = inPip2.read(in);s = new String(in, 0, len);String []ss= s.split("\n").clone();ArrayList<String> list=new ArrayList<String>();for(String n:ss) {System.out.println("输出"+n);}list.sort(null);for(int coun=0;coun<list.size();coun++){System.out.println(list.get(coun));}}}

第二版(对代码进行分离)
1、先是要向管道中放入数据,所以创建一个mInput类。该类的方法Input(String filename)使用 BufferedReader bufread按行读取文件的数据,然后放入管道中pip.getOutPip().write(s.getBytes());。
mInput类

package com.ren.cn;import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;/*** * @author huihui* 按行读取文件的数据并返回一个字符串的list*/
public class mInput {private BufferedReader bufread=null;private ArrayList<String> list=new ArrayList<String>();String s="";private Pipe pip=null;public mInput(Pipe pip) {this.pip=pip;}public void  Input(String filename) {try {bufread= new BufferedReader(new FileReader(filename));} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {while((s=bufread.readLine())!=null) {         pip.getOutPip().write(s.getBytes());}bufread.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

2、将数据从管道中取出,进行第一次的过滤,对数据进行移位处理,从而形成一些移位后新的句子 Move类,详细解释看代码中的注释,移位完成之后,还要将数据再送回管道。
Move类

package com.ren.cn;import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.ArrayList;
import java.util.StringTokenizer;/*** * @author huihui 这个类提供移位的方法*/
public class Move {byte[] out = new byte[1024];byte[] in = new byte[1024];int len = 0;String s = "";Pipe pip=null;public Move(Pipe pip) {this.pip=pip;}public void mymove() {try {len = pip.getInPip().read(in);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} // 从管道中拿取数据s = new String(in, 0, len);// 得到字符串s// 1、切分StringTokenizer tokener = new StringTokenizer(s, " ");// 2、进行移位操作String token = new String();int index;ArrayList<String> tokens = new ArrayList<String>();int count = tokener.countTokens();for (int j = 0; j < count; j++) {// 将一行解析,并且将解析的word加入ArrayList中token = tokener.nextToken();tokens.add(token);}ArrayList<String> kwicList = new ArrayList<String>();// 对ArrayList中的字进行循环移位,得出最后结果for (int i = 0; i < count; i++) {index = i;StringBuffer linebuffer = new StringBuffer();for (int j = 0; j < count; j++) {if (index >= count)index = 0;linebuffer.append(tokens.get(index));linebuffer.append(" ");index++;}String line = linebuffer.toString();kwicList.add(line);}/*** 3、移位之后再次写入到管道2中,进行下一个过滤器*/String s1 = "";for (int count1 = 0; count1 < kwicList.size(); count1++) {s1 = s1 + kwicList.get(count1) + "\n";}try {pip.getOutPip().write(s1.getBytes());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

3、再将数据从管道中取出,进行首字母排序的处理,使用基于数组的容器ArrayList ,调用其方法sort进行一键排序,将排好序的这些句子又重新放回管道。
InOrder类

package com.ren.cn;/*** * @author huihui*进行排序并且再次写入到下一个管道中*/import java.io.IOException;
import java.util.ArrayList;public class InOrder {private ArrayList<String> list = null;private byte[] in = new byte[1024];private String s1 = "";private Pipe pip=null;public InOrder(Pipe pip) {this.pip=pip;}public void inorder() {int len;try {len = pip.getInPip().read(in);String s = new String(in, 0, len);String[] ss = s.split("\n").clone();list = new ArrayList<String>();for (String n : ss) {list.add(n);}list.sort(null);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}for (int count1 = 0; count1 < list.size(); count1++) {s1 = s1 + list.get(count1) + "\n";}try {pip.getOutPip().write(s1.getBytes());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

4、最后再从管道中取出处理好的数据,写入到新的文件中,详细看代码注释
mOutput类

package com.ren.cn;
/*** * @author huihui*将所得的结果放回到文件中*/import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;public class mOutput {BufferedWriter writer=null;String s="";private Pipe pip;byte[] b = new byte[1024];public mOutput(Pipe pip) {this.pip=pip;}public void Output(String filename,ArrayList<String>list){try {writer =new BufferedWriter(new FileWriter(filename));int len = 0;len=pip.getInPip().read(b);//从管道中拿取数据s = new String(b, 0, len);writer.write(s);writer.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}   }}

5、当然了使用管道,对管道中的数据进行操作,怎么能没有管道呢!!!管道类,专门负责创建管道
Pipe类

package com.ren.cn;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
/*** * @author huihui* 这是一个管道类,专门用于创建管道*/
public class Pipe {private  PipedInputStream inPip;private  PipedOutputStream outPip;public Pipe() {outPip=new PipedOutputStream();inPip= new PipedInputStream();try {            inPip.connect(outPip);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public PipedInputStream getInPip() {return inPip;}public PipedOutputStream getOutPip() {return outPip;}
}

6、在main方法中进行测试

package com.ren.cn;import java.io.BufferedReader;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.ArrayList;public class test {/*** 进行测试(这是最终版)* * @param args* @throws IOException*/public static void main(String[] args) {String out = "";Pipe pip=new Pipe();        BufferedReader list = null;ArrayList<String> outlist =new ArrayList<String>();String filename = "main.txt";//要读取的文件String filenameout="test.txt";//最后写入的文件/*** 1、输入文件*/mInput input = new mInput(pip);input.Input(filename);/*** 2、进行移位*/Move mv = new Move(pip);mv.mymove();/*** 3、进行排序*/InOrder inorder = new InOrder(pip);inorder.inorder();/*** 4、写出文件*/mOutput oput=new mOutput(pip);oput.Output(filenameout, outlist);/*** 5、关闭管道*/try {pip.getInPip().close();pip.getOutPip().close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

7、最后差点忘了,应该贴上一张UML图
8、使用eclipse,自动生成类图!!别着急走,继续看
右击项目,选择new 选择other
选择这个

从而得到这样一个文件

打开这个newfile.cld文件然后选择所有的java文件,往这个newfile.cld文件中拖拽

就自动生成类图了。
参考内容:https://blog.csdn.net/it_man/article/details/5003836?locationNum=8

基于管道过滤器风格的-KWIC相关推荐

  1. 管道 过滤器风格 java_完成基于管道过滤器风格的KWI实现.doc

    完成基于管道过滤器风格的KWI实现.doc 实验2:软件体系结构风格实现 一.实验目的 初步了解不同的体系结构风格 掌握不同体系结构风格的实现 二.实验学时 4学时. 三.实验方法 根据KWIC的描述 ...

  2. 基于管道过滤器实现的kwic实现

    2019独角兽企业重金招聘Python工程师标准>>> KWIC索引系统接受一些行,每行有若干字,每个字由若干字符组成:每行都可以循环移位.重复地把第一个字删除,然后接到行末: KW ...

  3. 实践基于REST风格的Webservice(PHP,C#)

    概念: WEB服务的风格,从维基百科上查了一下,有不下十几种,但是比较常用的就是REST和RPC.其中,基于SOAP协议的Webservice就是RPC风格的. REST全称Representatio ...

  4. 基于注解风格的Spring-MVC的拦截器

    Spring-MVC如何使用拦截器,官方文档只给出了非注解风格的例子.那么基于注解风格如何使用拦截器呢? 基于注解基本上有2个可使用的定义类,分别是DefaultAnnotationHandlerMa ...

  5. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程

    最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tuto ...

  6. 二、为uniapp项目配置基于airbnb风格的Eslint代码检查规则

    上一节我们一起创建了基于Vue3 + TS + Vite的uniapp项目并配置了自动导入,接下来让我们一起来为项目配置基于基于airbnb规范的Eslint代码检查规则. 1.为什么要为项目配置Es ...

  7. 软件体系结构的第二次实验(解释器风格与管道过滤器风格

    一.实验目的 1.熟悉体系结构的风格的概念 2.理解和应用管道过滤器型的风格. 3.理解解释器的原理 4.理解编译器模型 二.实验环境 硬件: 软件:Python或任何一种自己喜欢的语言 三.实验内容 ...

  8. 软件体系结构的第二次实验(解释器风格与管道过滤器风格)

    一.实验目的 1.熟悉体系结构的风格的概念 2.理解和应用管道过滤器型的风格. 3.理解解释器的原理 4.理解编译器模型 二.实验环境 硬件: 软件:Python或任何一种自己喜欢的语言 三.实验内容 ...

  9. 基于Unix 风格的 Redox OS 0.7.0 发布

    今天,我们要介绍的主角是 Redox OS,它专注于稳定性和安全性.我们 早在 2016 年就报道过它,那时它还处于开发早期阶段(如果你感兴趣的话). Unix 风格的 Redox OS 0.7.0 ...

最新文章

  1. c:redirect标签的使用
  2. java任务_Java 任务处理
  3. TorgoiseGit配置ssh密钥
  4. SpringBoot最佳实践-Lombok简化开发
  5. “骗子”成民企院士第一人:把认真当信仰,人生就会开挂
  6. C++ 关于复制、移动构造函数和移动、复制 赋值运算符的重载问题;
  7. 红米旗舰机命名Redmi X?卢伟冰:会有更好的名字
  8. [算法] 循环有序数组查找递归实现
  9. node.js抓取数据(fake小爬虫)
  10. sed用法详解(转载)
  11. python小区管理系统设计_小区物业管理系统设计与实现
  12. Datawhale组队学习周报(第033周)
  13. 微信小程序关键字搜索
  14. 常用显卡驱动下载合集
  15. 《算法竞赛入门经典》Chap3
  16. 计算机毕业设计Java大学生兼职平台(源码+系统+mysql数据库+lw文档
  17. 旅行照片剪辑--北京篇
  18. 华为EMUI10更加面向用户 定位时尚优雅
  19. (转)CSS 基本知识
  20. 浏览器支持字体大小情况 以及 Chrome设置小于12px的字体的处理方案

热门文章

  1. 实验一. RFID自动读卡实验
  2. SQL Server 2017的Linked Server配置触发的bug“Exception Code = c0000005 EXCEPTION_ACCESS_VIOLATION”...
  3. 无刷电机无位置传感器启动
  4. EasyPro_90B编程器烧录器使用操作方法
  5. 微信公众平台开发(1)验证TOKEN源码
  6. 机器视觉光源的分类及各种光源的特点
  7. 点对点OSPF路由器配置
  8. The Codeless Code: Case 5 Void(void本质是什么)
  9. 微软视频直播服务器,使用微软云媒体服务快速搭建视频直播
  10. 游戏核心编程之一 概述