数据结构之字符串ADT

一、前言:

在Java语言中,可以用两种方法表示ADT的规格说明:

a.ADT的规格说明用抽象类(Abstract Class Declaration)表示,ADT的实现用继承改抽象类的具体类声明(Concrete Class Declaration)表示。

b.ADT的规格说明用Java接口(interface)表示,ADT的实现用实现该接口的类表示。


二、示例:

字符串ADT规格说明:

package com.java.datastructure.mystring;

public interface IMyString {
	
	public int length();//字符串长度
	
	public char charAt(int index);//返回字符串中下标index所对应的字符
	
	public boolean equals(IMyString myString);//比较两个字符串的内容是否一致
	
	public int compareTo(IMyString myString);//比较两个字符串的大小
	
	public MyString subString(int begin, int end);//截取字符串
	
	public MyString concat(IMyString myString);//拼接字符串

}


字符串ADT实现:

package com.java.datastructure.mystring;


public class MyString  implements IMyString{
	
	private char[] array;
	
	/**
	 * 将其转换为java.lang.String对象
	 */
	public String toString(){
		return new String(array);
	}
	
	/**
	 * 拼接字符串
	 * @param myString
	 * @return MyString 拼接后的新字符串
	 */
	public MyString concat(IMyString myString){
		MyString ms = (MyString) myString;
		int len = array.length + ms.length();
		char[] newArray = new char[len];
		int i = 0, j = 0;
		while(j<array.length){
			newArray[i++] = array[j++];
		}
		j=0;
		while(j < ms.array.length){
			newArray[i++] = ms.array[j++];
		}
		return new MyString(newArray);
	}
	
	/**
	 * 比较大小
	 * @param myString
	 * @return 1 : 大 ; -1 :小 ;0 : 相等
	 */
	public int compareTo(IMyString myString){
		MyString ms = (MyString)myString;
		int self = array.length;
		int other = ms.length();
		for(int i = 0; i < Math.min(self, other); i++){
			int comp = array[i] - ms.array[i];
			if(comp!=0){
				return comp;
			}
		}
		if(self > other){
			return +1;
		}else if(self < other){
			return -1;
		}else {
			return 0;
		}
	}

	/**
	 * 根据开始下标和结束下标,截取字符串
	 * @param begin
	 * @param end
	 */
	public MyString subString(int begin, int end){
		if(begin<0 || begin>=array.length || end<0 || end>=array.length || begin>end){
			throw new IndexOutOfBoundsException();
		}
		int len= end - begin;
		char[] newArray = new char[len];
		for(int i = 0; i < len; i++){
			newArray[i] = array[i+begin];
		}
		return new MyString(newArray);
	}
	
	/**
	 * 判断两个字符串是否相同
	 * @param myString
	 */
	public boolean equals(IMyString myString){
		MyString ms = (MyString)myString;
		if(ms.length() != array.length){
			return false;
		}
		for(int i=0; i < array.length; i++){
			if(array[i] != ms.array[i]){
				return false;
			}
		}
		return true;
	}
	
	/**
	 * 根据下标,得到所在元素
	 * @param index 下标
	 */
	public char charAt(int index){
		if(index < 0 || index > array.length){
			throw new IndexOutOfBoundsException();
		}
		return array[index];
	}
	
	/**
	 * 计算字符串长度
	 */
	public int  length() {
		return array.length;
	}
	
	/**
	 * Constructors
	 */
	public MyString(){
		this.array = new char[0];
	}
	
	/**
	 * Constructors
	 * @param that
	 */
	public MyString(char[] that){
		array = new char[that.length];
		for(int i=0; i<that.length; i++){
			array[i] = that[i];
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值