package string;
public interface IStringBuffer {
public void append(String str);
public void append(char c);
public void insert(int pos,char b);
public void insert(int pos,String b);
public void delete(int start);
public void delete(int start,int end);
public void reverse();
public int length();
}
package string;
public class MyStringBuffer implements IStringBuffer {
int capacity = 16;
int length = 0;
char[] value;
public MyStringBuffer(){
value = new char[capacity];
}
public MyStringBuffer(String str){
this();
if(null == str){
return;
}
if(capacity < str.length()){
capacity = value.length*2;
value = new char[capacity];
}
if(capacity>=str.length()){
System.arraycopy(str.toCharArray(),0,value,0,str.length());
}
length = str.length();
}
public static void main(String[] args){
MyStringBuffer msb = new MyStringBuffer("abcdefghigh");
System.out.println(msb);
msb.insert(0,"aha ");
System.out.println(msb);
msb.insert(0,'b');
System.out.println(msb);
msb.append('c');
System.out.println(msb);
msb.append(" dddd");
System.out.println(msb);
msb.delete(0,4);
System.out.println("delete test: "+msb);
msb.delete(12);
System.out.println(msb);
}
@Override
public void append(String str) {
insert(length,str);
}
@Override
public void append(char c) {
insert(length,String.valueOf(c));
}
@Override
public void insert(int pos, char b) {
insert(pos,String.valueOf(b));
}
@Override
public void insert(int pos, String b) {
if(pos<0){
return;
}
if(pos>length){
return;
}
if(null==b){
return;
}
while((length+b.length())>capacity){
capacity =(int)((length+b.length()) *2f);
char[] newValue = new char[capacity];
System.arraycopy(value,0,newValue,0,length);
value = newValue;
}
char[] cs = b.toCharArray();
System.arraycopy(value,pos,value,pos+cs.length,length-pos);
System.arraycopy(cs,0,value,pos,cs.length);
length += cs.length;
}
@Override
public void delete(int start) {
delete(start,length);
}
@Override
public void delete(int start, int end) {
if(start<0){
return;
}
if(end<0){
return;
}
if(end<start){
return;
}
if(end>length){
return;
}
System.arraycopy(value,end,value,start,length-end);
length -= end-start;
}
@Override
public void reverse() {
for(int i=0;i<length/2;i++){
char temp = value[i];
value[i] = value[length-i-1];
value[length-i-1] = temp;
}
}
@Override
public int length() {
return length;
}
public String toString(){
char[] realValue = new char[length];
System.arraycopy(value,0,realValue,0,length);
return new String(realValue);
}
}