基于面向对象(抽象数据类型)风格的kwic实现

ObjectOrientedMain类

/**
 * 
 */
package com.jason.kwic.objectOriented;

import java.io.IOException;

/**
 * @author jasonzhang
 *
 */
public class ObjectOrientedMain {

	public static void main(String[] args) throws IOException {
		Output output = new Output();
		Alphabetizer sorter = new Alphabetizer(output);
		Shift shift = new Shift(sorter);
		Input input  = new Input(shift);
		input.input("d:\\temp\\mykwic_in.txt");
		shift.shift();
		sorter.sort();
	}
}

Output类

/**
 * 
 */
package com.jason.kwic.objectOriented;

import java.util.ArrayList;

/**
 * @author jasonzhang
 *
 */
public class Output {

	public void output(ArrayList<String> lines) {
		System.out.println("output is");
		 for (String line : lines) {
			System.out.println(line);
		 }
	}
}

Alphabetizer类

/**
 * 
 */
package com.jason.kwic.objectOriented;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/**
 * @author jasonzhang
 *
 */
public class Alphabetizer {
	private ArrayList<String> lines = new ArrayList<String>();

	private Output output;
	public Alphabetizer(Output output) {
		this.output = output;
	}
	public void addLine(String line) {
		this.lines.add(line);
	}
	public void sort() {
		 Collections.sort(this.lines, new AlphaabetizerComparator());
		this.output.output(this.lines);
	}

	private class AlphaabetizerComparator implements Comparator<String> {

		@Override
		public 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;
		}
    
    }
}

Shift类

/**
 * 
 */
package com.jason.kwic.objectOriented;

import java.util.ArrayList;
import java.util.StringTokenizer;

/**
 * @author jasonzhang
 *
 */
public class Shift {

	private ArrayList<String> lines = new ArrayList<String>();

	//private ArrayList<String> shifedLines = new ArrayList<String>();

	private Alphabetizer sorter;

	public Shift(Alphabetizer sorter) {
		this.sorter = sorter;
	}

	public void addLine(String line) {
		this.lines.add(line);
	}

	public void shift() {
		for (String line : this.lines) {
			this.shiftLine(line);
		}
	}

	private void shiftLine(String line) {
		ArrayList<String> wordList = new ArrayList<String>();
		StringTokenizer st = new StringTokenizer(line, " ");
		while (st.hasMoreTokens()) {
			wordList.add(st.nextToken());
		}
		int wordNums = wordList.size();
		StringBuilder tempLine = new StringBuilder();
		//System.out.println("shifed is");
		for (int i=0; i<wordNums; i++) {
			for (int j=(wordNums - 1 -i); j < wordNums; j++) {
				tempLine.append(wordList.get(j)).append(‘ ‘);
			}
			for (int k=0; k<(wordNums - 1 -i); k++) {
				if (k != (wordNums - i - 2)) {
					tempLine.append(wordList.get(k)).append(‘ ‘);
				} else {
					tempLine.append(wordList.get(k));
				}
			}
			//System.out.println(tempLine.toString());
			//this.shifedLines.add(tempLine.toString());
			this.sorter.addLine(tempLine.toString());
			tempLine.delete(0, tempLine.length());
		}
	}
}

Input类

/**
 * 
 */
package com.jason.kwic.objectOriented;

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

/**
 * @author jasonzhang
 *
 */
public class Input {
	private Shift shift;

	public Input(Shift shift) {
		this.shift = shift;
	}

	public void input(String filePath) throws IOException {
		File infile = new File(filePath);
		Scanner sc = new Scanner(infile);
		String tempLine = null;
		System.out.println("input is");
		while (sc.hasNextLine()) {
			tempLine = sc.nextLine();
			System.out.println(tempLine);
			this.shift.addLine(tempLine);
		}
	}
}
时间: 2024-10-29 07:03:26

基于面向对象(抽象数据类型)风格的kwic实现的相关文章

基于隐式调用风格的kwic实现

ImplicitlyCallMain类 /**  *   */ package com.jason.kwic.implicitlyCall; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Scanner; /**  * @author jasonzhang  *  */ public class ImplicitlyCallMain { public static 

抽象数据类型(ADT)和面向对象编程(OOP)3.3 抽象数据类型

抽象类型的新颖性和不同之处在于对操作的关注:类型的用户不需要担心它的值如何实际存储 类型无论是内置的还是用户定义的,都可以分类为可变或不可变 可变类型的对象可以被改变 String是不可变的,因为它的操作创建了新的String对象而不是改变现有的对象 有时一种类型将以两种形式提供,一种可变形式和一种不可变形式. 例如,StringBuilder是String的一个可变版本(不可互换) Creators (构造器)创建该类型的新对象.Creators可以将对象作为参数,但不是正在构建的类型的对象.

【Python&amp;数据结构】 抽象数据类型 Python类机制和异常

这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Python编程,借着本次机会仔细学习一下. 抽象数据类型 最开始的计算机语言,关注的都是如何更加有效率地计算,可以说其目的是计算层面的抽象.然而随着这个行业的不断发展,计算机不仅仅用于计算,开发也不仅只关注计算过程了,数据层面的抽象也变得同样重要.虽然计算机语言一开始就有对数据的抽象,但是那些都只是对一些最基本的

C++服务器开发之基于对象的编程风格

Thread.h #ifndef _THREAD_H_ #define _THREAD_H_ #include <pthread.h> #include <boost/function.hpp> class Thread { public: typedef boost::function<void ()> ThreadFunc; explicit Thread(const ThreadFunc& func); void Start(); void Join();

轻松学习JavaScript十二:JavaScript基于面向对象之创建对象(二)

四原型方式 我们创建的每个函数都有一个通过prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型 的所有实例共享的属性和方法.逻辑上可以这么理解:prototypt通过条用构造函数而创建的那个对象的原型对象.使 用原型的好处就是可以让所有对象实例共享它所包含的属性和方法.也就是说,不必在构造函数中定义对象信息,而 是直接将这些信息添加到原型中. 原型方式利用了对象的prototype 属性,可以把它看成创建新对象所依赖的原型.这里,首先用空构造函数来设置 函数名.然后所

C++抽象数据类型,如何抽象

C++是个多范式的语言,所以C++难学,所以C++强大,可比起java,C#,用C++来做软件开发,开发周期要长很多. 为什么呢?这是因为C++的自由度高,换句话说自由度越高地语言,开发软件的周期越长,这是有一定道理的 自由度过高就不容易掌控,java和C#它们的库很强大,这在一定程度上就限制了自由度,相当于提供了一套模式,方法,开发人员不需要去为实现这些东西而操心 然而C++程序员却需要为这些费劲心力,这体现在实现细节上. 本文要说的是抽象数据类型,抽象数据类型 ADT 一种重要的数据类型.它

笔记-[面向对象]-JS基于面向对象编程-[1]

面向对象(oop):是一种开发过程中,以面向对象的一种编程思维进行开发. 在JS中,我们一般采用的是面向过程的开发. 面向对象的特点:抽象.封装.继承.多态 先看看自定义对象如何写:自定义一个人的对象,人的名字,年龄,或者是说话.在下面,name age是这个人的属性,说话是这个人的一种行为,也可以叫方法.这样也可以理解为一个简单的面向对象的编程.对象从哪里来,如 var arr=new Array();这个就是一个数组的对象,它从js的一个内定的系统方法类来的. 例如:定义一个人的类,每一个人

数据类型和抽象数据类型

<(^-^)> 我们知道在各种编程语言中都会有数据类型. 一.数据类型 先看看为什么会有不同的数据类型呢?很简单,很多东西不能一概而论,而是需要更精确的划分.计算机计算1+1并不需要多么大的空间,但是计算10000000000+1000000000就得需要有个比较大的空间来放.还有有时候会计算小数,小数的位数不一样,需要的空间也就不一样.数字1和字母a也需要区分啊,于是开发者就想出了“数据类型”这一招,用来描述不同的数据的集合. 我记得最早接触的数据类型就是int了.当初一个int a;就把我

计算机软考笔记之《抽象数据类型(ADT)》

1.引言 1抽象数据类型和数据结构的关系 抽象数据类型(ADT)是一种比数据结构处于更高抽象层的数据类型,ADT使用数据结构来实现. 2数据类型的定义和应用于数据的操作定义是ADT背后的一部分概念,隐藏数据上的操作是如何进行的. 3分类:简单抽象数据类型和复杂抽象数据类型 简单ADT:整数.实数.字符.指针: 复杂ADT:需要建立.不需要详细说明实现过程的泛化操作成为抽象. 抽象概念意味着: ①知道一个数据类型能做什么: ②如何去做是隐藏的. 4定义 抽象数据类型就是与对数据类型有意义的操作封装

抽象数据类型(ADT)入门(一)

抽象数据类型(ADT)入门(一) 1.抽象数据类型(Abstract Data Types,ADT)和ADT的实现 抽象数据类型:一个数据元素集合以及在这些数据上的操作. ADT的一个实现包括存储数据元素的存储结构以及实现基本操作的算法. 在这个数据抽象的思想中,数据类型的定义和它的实现是分开的,这在软件设计中是一个重要的概念.这使得只研究和使用它的结构而不用考虑它的实现细节成为可能.实际上,这通常使用在int.double.char和bool等预定义数据类型上的方法,使用这些数据类型的程序员在