KWIC(Key Word In Context),Parnas (1972)索引系统
KWIC索引系统接受一些行,每行有若干字,每个字由若干字符组成;每行都可以循环移位,亦即重复地把第一个字删除,然后接到行末; KWIC把所有行的各种移位情况按照字母表顺序输出(不考虑大小写)。
输入:若干行字符语句
The sun is rising in the east
Flowers are blooming
中间过程:循环移位后形成下面的结果
The sun is rising in the east
sun is rising in the east the
is rising in the east the sun
rising in the east the sun is
in the east the sun is rising
the east the sun is rising in
east the sun is rising in the
Flowers are blooming
are blooming Flowers
blooming Flowers are
输出:排序后的结果
are blooming Flowers
blooming Flowers are
east the sun is rising in the
Flowers are blooming
in the east the sun is rising
is rising in the east the sun
rising in the east the sun is
sun is rising in the east the
the east the sun is rising in
The 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() {
//获取每个单词,存入tokens
Iterator<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;
//存入StringBuffer
lineBuffer.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> {
@Override
public 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(