package Data_Structure;import java.util.NoSuchElementException;public final class MyString {private final char[] data;public MyString(){data = new char[0];}//根据传入字符串构造串public MyString(String str){data = new char[str.length()];for(int i=0;i<str.length();i++){data[i]= str.charAt(i);}}//根据传入MyString构造字符串,等同于构造赋值方法public MyString(MyString str){if(str==null)throw new IllegalArgumentException("参数不能为null");data = new char[str.length()];for(int i=0;i<str.length();i++)data[i] = str.charAt(i);}public MyString(int length){data = new char[length];}//该操作将覆盖目标原来的内存public static MyString strCopy(MyString res){if(res==null)throw new IllegalArgumentException("参数不能为null");return new MyString(res);}//返回字符串长度public int length(){return this.data.length;}//返回索引所在字符public char charAt(int index){return this.data[index];}//空返回真,反之返回假public boolean empty(){if(this.length()==0)return true;else{return false;}}// 比较字符串大小public int compareTo(MyString str) {// 1. 异常选型建议:参数为空通常抛出 NullPointerException 或 IllegalArgumentExceptionif (str == null) {throw new NullPointerException("Comparison target is null");}int len1 = this.length();int len2 = str.length();// 2. 核心:确定比较的边界限制int lim = Math.min(len1, len2);int i = 0;while (i < lim) {char c1 = this.charAt(i);char c2 = str.charAt(i);if (c1 != c2) {// // 3. 发现不相等的字符,直接返回差值return c1 - c2;}i++;}// 4. 重要:如果运行到这里,说明在 min(len1, len2) 范围内字符全部相等// 此时根据长度判断,例如 "abc" < "abcd",返回 -1return len1 - len2;}//静态工厂方法public static MyString valueOf(String str){if(str==null)throw new IllegalArgumentException("参数为空");return new MyString(str);}//将串2连接到串1后面public MyString concat(MyString string){int newLength = this.length() + string.length();MyString newStr = new MyString(newLength);//分配足额空间//先赋值原先的for(int i=0;i<this.length();i++){newStr.data[i] = this.data[i];}//再赋值附加的for(int i=newLength-string.length(),j=0;i<newLength;i++,j++){newStr.data[i] = string.charAt(j);}return newStr;}//返回从pos起len长度的串public MyString substring(int pos,int len){MyString sub = new MyString(len);if(this.data==null){throw new NoSuchElementException();}// 参数校验if (pos < 0 || len < 0) {throw new IllegalArgumentException("位置和长度不能为负数");}if (pos >= this.length()) {throw new IllegalArgumentException("起始位置超出字符串长度");}if (pos + len > this.length()) {throw new IllegalArgumentException("截取长度超出字符串范围");}for(int i=pos,j=0;i<pos+len;i++,j++){sub.data[j]=this.data[i];}return sub;}//从主串第pos位置开始,查找与sub相同的子串,返回位置,查找失败返回0 ,朴素算法public int index(MyString sub,int pos){if(pos<0 || pos>=length()){throw new IllegalArgumentException("pos参数越界");}if(this.data==null ||sub==null)throw new NoSuchElementException("主串或待查子串为空");int index=pos; //从pos起搜索主串int j=0; //遍历子串while(index<this.length() && j<sub.length()){//如果相等,继续匹配下一个if(this.data[index]==sub.data[j]){j++;index++;}else{//如果不匹配,让主串从下一个重新开始搜索index = index-j+1;j=0;}}//结束后,如果j的长度等于子串的长度, 则说明匹配成功if(j==sub.length())return index-j+1;elsereturn 0;}//插入串public MyString insert(MyString str,int pos){if(str==null || pos<0 ||pos>this.length())throw new IndexOutOfBoundsException("串str为空或非法下标");int newLength = this.length()+str.length();MyString newStr = new MyString(newLength); //分配新长度//先复制原先的字符串for(int i=0;i<this.length();i++){newStr.data[i] = this.data[i];}//再通过新字符串依次后移str.length()个字符for(int i=this.length()-1;i>=pos;i--){//依次后移str.length位newStr.data[i+str.length()] = this.data[i];}//插入参数中的字符串for(int i=0;i<str.length();i++){newStr.data[i+pos]=str.data[i];}return newStr;}public MyString delete(int pos,int len){if(this.data==null)throw new NoSuchElementException();if(pos<0||pos+len>this.length())throw new IllegalArgumentException("非法参数");//由于字符数组构造之后,其length不可改变//所以要提前构造一个新的MyString deStr = new MyString(this.length()-len);//复制0到pos前的字符int i=0;for(i=0;i<pos;i++){deStr.data[i] =this.data[i];}//跳过pos到len的字符,为pos+len 到this.length;for(int j=pos+len;j<this.length();j++){deStr.data[i++] = this.data[j];}return deStr;}//类相等判断@Overridepublic boolean equals(Object str){//向下转换//引用简称if(this==str)return true;//空引用简称if(str ==null)return false;// 比较是不是同类if(getClass()!=str.getClass())return false;MyString other =(MyString) str;//比较字符长度if(this.length()!=other.length())return false;//依次比较每个字符for(int i=0;i< other.length();i++){if(this.data[i]!=other.data[i])return false;}return true;}public String toString(){return new String(this.data);}public static void main(String[] args){MyString str =new MyString("String");str = MyString.valueOf("Hello");MyString str2=new MyString(" World");MyString str3 = str.concat(str2);System.out.println(str3);MyString test = new MyString("AI");str= str.insert(test,2);System.out.println(str);str = str3.delete(2,3);System.out.println(str);}
}