学习日志---串MyString

操作集合:比较方法,当前串与串的Unicode码值得大小,和C语言不一样,C比较的是ASCII码。

串的顺序存储结构;串的链式存储结构。

下面是自定义的MyString:

//用户自定义的MyString类
public class MyString {

	private char[] value; //字符数组
	private int count; //字符串的长度

	//从源串指定下标开始拷贝指定长度的字符串到目标串指定为下标开始
	//char[] src:源串
	//int srcPos:源串的开始下标
	//char[] dst:目标串
	//int dstPos:目标串开始下标
	//int length:拷贝长度
	public static void arrayCopy(char[] src,int srcPos,char[] dst,int dstPos,int length)
	{   
		//如果源串起始下标+拷贝长度>源串长度或者目标串起始下标+拷贝长度>目标串长度
		if(srcPos+length>src.length||dstPos+length>dst.length)
		{
			throw new StringIndexOutOfBoundsException(length);
		}
		for(int i=0;i<length;i++)
		{
			dst[dstPos++]=src[srcPos++];
		}
	}

	//构造方法1,构造一个空字符串
	public MyString()
	{
		value=new char[0];
		count=0;
	}
	//构造方法2,实现从一个字符中提取出新的字符串。
	//char[] value:已有的字符数组。
	//int offset:起始下标
	//int count:拷贝的个数
	public MyString(char[] value,int offset,int count)
	{
		//判断起始位置是否<0
		if(offset<0)
		{
		   throw new StringIndexOutOfBoundsException(offset);  
		}
		//判断count是否<0
		if(count<0)
		{
		   throw new StringIndexOutOfBoundsException(count);
		}
		//判断起始位置+count是否大于value字符串的长度

		if(offset+count>value.length)
		{
		   throw new StringIndexOutOfBoundsException(offset+count);
		}
		this.value = new char[count];
		this.count = count;
		arrayCopy(value,offset,this.value,0,count);

	}

	//构造方法3,根据已有的字符数组,构造新的字符串
	public MyString(char[] value)
	{
		this.count = value.length;
		this.value = new char[count];
		arrayCopy(value,0,this.value,0,count);
	}

	//构造方法4,使用JDK本身的String类,构造新的字符串
	public MyString(String str)
	{
	  char[] chararray = str.toCharArray();
	  value = chararray;
	  count = chararray.length;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		String str="";
		for(int i=0;i<count;i++)
		{
			str+=value[i];
		}
		return str;
	}

	public int length()
	{
		return count;
	}

	public char charAt(int index)
	{
	   if(index<0||index>=count)
	   {
		   throw new StringIndexOutOfBoundsException(index); 
	   }
	   return value[index];
	}

	//比较两个字符串的大小
	//如果当前字符串大于比较字符串,返回一个正整数
	//如果当前字符串等于比较字符串,返回0
	//如果当前字符串小于比较字符串,返回负整数

	public int compareTo(MyString anotherStr)
	{
		int len1= this.count;
		int len2 = anotherStr.length();
		int n = Math.min(len1, len2);
		char[] v1 = value;
		char[] v2 = anotherStr.value;
	    int i=0;
	    while(i<n)
	    {
	      char c1 =v1[i];
	      char c2 =v2[i];
	      if(c1!=c2)
	      {
	    	  return c1-c2;
	      }
	      i++;
	    }
	    
	    return len1-len2;
	}

}

	//求子串1,给出起始下标
	public MyString substring(int beginIndex,int endIndex)
	{
		if(beginIndex<0)
		{
		   throw new StringIndexOutOfBoundsException(beginIndex);
		}
		if(endIndex>count)
		{
		   throw new StringIndexOutOfBoundsException(endIndex);
		}
		if(beginIndex>endIndex)
		{
		   throw new StringIndexOutOfBoundsException(endIndex-beginIndex);
		}

		return (beginIndex==0&&endIndex==count)?this:new MyString(value,beginIndex,endIndex-beginIndex);

	}

	//求子串2,给出开始下标,到字符串末尾
	public MyString substring(int beginIndex)
	{
	    return substring(beginIndex,count);
	}

	//这个方法是取出MyString里的value,返回字符数组,因为java里的都是引用,因此需要在堆中new出新空间,以免更改原MyString的信息**************
	//这个很重要,使MyString的值不变**********************
	public char[] toCharArray()
	{
	   char[] buff = new char[count];
	   arrayCopy(value,0,buff,0,count);
	   return buff;
	}

	//字符串的连接
	public MyString concat(MyString str)
	{
	   int otherLen = str.length();
	   char[] strarray = str.toCharArray();
	   if(otherLen==0)
	   {
		  return this;   
	   }
	   char[] buff = new char[count+otherLen];
	   arrayCopy(value,0,buff,0,count);
	   arrayCopy(strarray,0,buff,count,otherLen);
	   return new MyString(buff);
	}

	//插入子串
	public MyString insert(MyString str,int pos)
	{
		if(pos<0||pos>count)
		{
		   throw new StringIndexOutOfBoundsException(pos);
		}
		if(pos!=0)
		{
		  //获得插入点之前的子串 
		  MyString str1 =this.substring(0, pos);
		  //获得插入点之后的子串
		  MyString str2 = this.substring(pos);
		  MyString res1 = str1.concat(str);
		  MyString res2 = res1.concat(str2);
		  return res2;
		}
		else
		{
		  return str.concat(this);
		}
	}

	//删除子串
	public MyString delete(int beginIndex,int endIndex)
	{
		if(beginIndex<0)
		{
		    throw new StringIndexOutOfBoundsException(beginIndex);
		}
		if(endIndex>count)
		{
			throw new StringIndexOutOfBoundsException(endIndex);
		}
		if(beginIndex>endIndex)
		{
			throw new StringIndexOutOfBoundsException(endIndex-beginIndex);
		}
		//删除整个字符串
		if(beginIndex==0&&endIndex==count)
		{
			return new MyString();
		}
		else
		{
			//获得删除点前的子串
			MyString str1 = this.substring(0,beginIndex);
			//获得删除子串后的子串
			MyString str2 = this.substring(endIndex);
			return str1.concat(str2);
		}

	}
}

String的内部存储也是字符数组,所以把String当作类时,是把字符数组包在类中,把String New出来即可。需要String的时候,都是new出来的,字符数组当作构造参数传入。

时间: 2024-12-13 00:16:39

学习日志---串MyString的相关文章

学习日志---串MyStringBuffer

MyStringBuffer:对象不变,里面的值改变,即字符数组改变,这是与MyString类最大的差别. //用户自定义的MyStringBuffer类 public class MyStringBuffer { private char[] value; //字符数组 private int count; //字符串的长度 //从源串指定下标开始拷贝指定长度的字符串到目标串指定为下标开始 //char[] src:源串 //int srcPos:源串的开始下标 //char[] dst:目标

学习日志---串的匹配模式(BF和KMP)

Brute-Force: 其基本思路是:从目标串s="s0s1-sn-1"的第一个字符开始和模式串t="t0t1-tm-1"中的第一个字符比较,若相等,则继续逐个比较后续字符,否则,从目标串s的第2个字符开始重新与模式串t的第一个字符进行比较,依次类推,若从目标串s的第i个字符开始,每个字符依次和模式串t中的对应字符相等,则匹配成功,该算法返回i;否则匹配失败,返回-1. //Brute-Force算法 public class BruteForce {    pu

mysql学习日志

Mysql学习日志; 安装:Linux :yum install mysql* -y 验证Mysql是否正常安装:mysqladmin --version 进入 Mysql,要先启动#service mysqld start#mysql 更换Mysql初始密码: 安装完成mysql为空密码,修改密码方式:mysqladmin -u root password newpassword 用户已经有旧密码的更改方式:MYSQLADMIN -u root -p'oldpassword' PASSWORD

winform学习日志(二十三)---------------socket(TCP)发送文件

一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using Sys

Linux学习日志2-vim使用基础

vim是linux操作系统下的一个文本编辑工具,功能非常强大,但刚学习起来比较复杂.vim的所有功能要讲明白得有几百页,在这里只是记录一下vim的一些基本用法. 首先vim打开文件的三种方式: vim +# xxx(#是数字):表示打开xxx文件并将光标定位到指定行. vim -o xx1 xx2 xx3:表示同时打开三个文件,垂直分割显示 vim -O xx1 xx2 xx3:表示同时打开三个文件,水平分割显示 多个文件间跳转:键入ctrl+w后:→向左.←向右.↑向上.↓向下 vim打开文件

Linux学习日志day1——无人值守系统安装DHCP+TFTP+PXE+Kickstar

Linux学习日志day1--无人值守批量系统远程网络安装(DHCP+TFTP+PXE+Kickstar)                                         --作者:江信瀚 服务器环境介绍: 主机名:workstation.example.com 关闭SElinux以及防火墙 虚拟机:VMware(关闭了VMware的DHCP服务) 网卡配置: 静态IP获取! IPV6全部都删除,因为根本用不到 子网IP可以在VMware中设置 8.8.8.8是谷歌的DNS服务器

Cocos2d-x 3.1.1 学习日志4--cocos2d-x解决中文乱码问题的几种办法

做个打飞机的游戏,由于版本太新,网上基本没有教教程,我的版本是cocos2d-x 3.1.1的,今天遇到cocos2dx中中文乱码的问题.无奈只好Google百度寻求答案,明白了这个问题的缘由.因为cocos2d-x内部是以utf8处理文本的,而VS直接输入时文本编码为GBK,如果添加L标志,则为Unicode编码. 解决这个问题有三种办法: 将源代码文件保存为utf8编码,不过由于编译器的问题,这种方式会导致很多无法预测的问题 将字符串用utf8编码集中存到一文件中,然后用代码读取这些字符串来

Cocos2d-x 3.1.1 学习日志3--C++ 初始化类的常量数据成员、静态数据成员、常量静态数据成员

有关const成员.static成员.const static成员的初始化: 1.const成员:只能在构造函数后的初始化列表中初始化 2.static成员:初始化在类外,且不加static修饰 3.const static成员:类只有唯一一份拷贝,且数值不能改变.因此,可以在类中声明处初始化,也可以像static在类外初始化 #include <iostream> using std::cout; using std::endl; class base { public: base(int

SQL 学习日志01

查看一个数据库的所有表: Select TABLE_NAME FROM 数据库名称.INFORMATION_SCHEMA.TABLES Where TABLE_TYPE='BASE TABLE' (select * from 表名 where 条件) 查看一张表的表结构: sp_help table_name(表名)  获取的信息比较全 sp_columns table_name(表名) 创建数据库: use master go create database test01(数据库名) 删除数据