学習ログ---シリアルMyString
4953 ワード
操作集合:比較方法、現在の列と列のUnicodeコードは大きさに値し、C言語とは異なり、CはASCIIコードを比較する.
シリアルのシーケンスストレージ構造;シリアルのチェーンストレージ構造.
以下はカスタムMyStringです.
Stringの内部記憶も文字配列なのでStringをクラスとする場合は,文字配列をクラスに包み,String Newを出せばよい.Stringが必要な場合は、newが出てきて、文字配列が構造パラメータとして伝わります.
シリアルのシーケンスストレージ構造;シリアルのチェーンストレージ構造.
以下はカスタム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が出てきて、文字配列が構造パラメータとして伝わります.