学習ログ---シリアル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が出てきて、文字配列が構造パラメータとして伝わります.