自定义MyBuffer

package 数字与字符.Test01StringBuffer;

public class MyStringBuffer implements IStringBuffer {

    char [] cs;

    private int index = 0;  // cs的索引号
    // 默认构造
    public MyStringBuffer() {
        cs = new char[16]; // 默认容量16
    }
    // 带参构造
    public MyStringBuffer(String str){
        cs = str.toCharArray();
    }

    @Override
    public String toString() { // 重写toString方法
        return new String(cs);
    }
    // 在末尾加字符串
    @Override
    public void append(String str) {
        // 判断cs容量够否,不够就扩容,一直扩容到够为止
        while (cs.length - getCharNull(cs)  < str.length()){  
            //getCharNull 方法是返回字符数组第一个为空的索引
            cs = expendArr(cs);  // 调用扩容方法,返回字符数组,参数字符数组
        }
        index = getCharNull(cs);
        char[] addCs = str.toCharArray();
        //  增加字符串
        for (int i = 0;i < str.length(); index++, i++) {
                cs[index] = addCs[i];
        }

    }
//  在末尾添加字符
    @Override
    public void append(char c) {
        cs = expendArr(cs, 1); //  调用方法 传递参数cs字符数组,1为扩容增加的大小
        cs[cs.length - 1] = c;  // 添加c字符到字符数组末尾
    }

    @Override
    public void insert(int pos, char b) {    // pos这里没有判断,所以已知bug:pos不能大于最大索引
        // 增加容量大小为1
        cs = expendArr(cs, 1);
        // 将pos位置的字符依次向后移动1位
        for (int j = 1; j < cs.length - pos ; j++) {
            cs[cs.length - j] = cs[cs.length - j - 1];
        }
        // 插入字符
        cs[pos] = b;

    }

    @Override
    public void insert(int pos, String b) {
        // 增加容量
        cs = expendArr(cs, b.length());
//      字符在数组中向后移动一定长度
        for (int i = 1; i < cs.length - pos - b.length() + 1; i++) {
            cs[cs.length - i] = cs[cs.length - i - b.length()];
        }
//      临时字符数组
        char[] cs_Tmp = b.toCharArray();
        // 添加字符到指定位置
        for (int i = 0; i < b.length(); pos++, i++) {
            cs[pos] = cs_Tmp[i];
        }
    }

    @Override
    public void delete(int start) {
        // 调用删除方法,返回删除后的字符数组
        cs = deleteArr(cs, start);
    }

    @Override
    public void delete(int start, int end) {
        
        cs = deleteArr(cs, start, end);
    }

    @Override
    public void reverse() {
        
        index = cs.length -1;
       char[] chars = new char[cs.length];
       
        for (int i = 0; i < cs.length; i++) {
            chars[i] = cs[index--];
        }
        cs = chars;
    }
// 返回已经存储的容量
    @Override
    public int length() {
        return cs.length;
    }
    // 得到空字符的位置
    private int getCharNull(char[] cs){

        for (int i = 0; i < cs.length; i++) {
            if(cs[i] == '\u0000'){
                return i;
            }
        }
        return cs.length; // 没有就返回原始长度
    }
    // 扩容方法
    private char[] expendArr(char[] cs){

        char[] cs1 = new char[cs.length * 2];

        for (int i = 0; i < cs.length; i++) {
            cs1[i] = cs[i];
        }
        return cs1;
    }
    // 指定大小的扩容
    private char[] expendArr(char[] cs, int i){

        char[] cs1 = new char[cs.length + i];

        for (int j = 0; j < cs.length; j++) {
            cs1[j] = cs[j];
        }
        return cs1;
    }
    
    private char[] deleteArr(char[] cs, int i){

        char[] cs1 = new char[i+1];

        for (int j = 0; j < cs1.length; j++) {
            cs1[j] = cs[j];
        }
        return cs1;
    }
    private char[] deleteArr(char[] cs, int start, int end){

        char[] cs1 = new char[end - start + 1];

        for (int j = 0; j < cs1.length; j++, start++) {
            cs1[j] = cs[start];
        }
        return cs1;
    }
}

**总结:**1.对细节把握要牢固
2.数组传递的是地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值