zoukankan      html  css  js  c++  java
  • 数字与字符串系列教材 (十)- 自己开发一个Java StringBuffer

    StringBuffer第二道练习题答案

    步骤1:IStringBuffer接口
    步骤2:value和capacity
    步骤3:带参构造方法
    步骤4:反转 reverse
    步骤5:插入insert 和 append
    步骤6:删除 delete
    步骤7:练习-性能比较
    步骤8:答案-性能比较

    步骤 1 : IStringBuffer接口

    package character;

      

    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); //从开始位置删除结束位置-1

        public void reverse(); //反转

        public int length(); //返回长度

    }

    步骤 2 : value和capacity

    value:用于存放字符数组
    capacity: 容量
    无参构造方法: 根据容量初始化value

    public MyStringBuffer(){

        value = new char[capacity];

    }

    package character;

    public class MyStringBuffer implements IStringBuffer{

        int capacity = 16;

        int length = 0;

        char[] value;

        public MyStringBuffer(){

            value = new char[capacity];

        }

         

        @Override

        public void append(String str) {

            // TODO Auto-generated method stub

             

        }

        @Override

        public void append(char c) {

            // TODO Auto-generated method stub

             

        }

        @Override

        public void insert(int pos, char b) {

            // TODO Auto-generated method stub

             

        }

        @Override

        public void delete(int start) {

            // TODO Auto-generated method stub

             

        }

        @Override

        public void delete(int start, int end) {

            // TODO Auto-generated method stub

             

        }

        @Override

        public void reverse() {

            // TODO Auto-generated method stub

             

        }

        @Override

        public int length() {

            // TODO Auto-generated method stub

            return 0;

        }

    }

    步骤 3 : 带参构造方法

    package character;

    public class MyStringBuffer implements IStringBuffer{

        int capacity = 16;

        int length = 0;

        char[] value;

        public MyStringBuffer(){

            value = new char[capacity];

        }

         

        //有参构造方法

        public MyStringBuffer(String str){

            if(null!=str)

                value =str.toCharArray();

             

            length = value.length;

             

            if(capacity<value.length)

                capacity  = value.length*2;

        }

         

        @Override

        public void append(String str) {

            // TODO Auto-generated method stub

             

        }

        @Override

        public void append(char c) {

            // TODO Auto-generated method stub

             

        }

        @Override

        public void insert(int pos, char b) {

        }

        @Override

        public void delete(int start) {

            // TODO Auto-generated method stub

             

        }

        @Override

        public void delete(int start, int end) {

            // TODO Auto-generated method stub

             

        }

        @Override

        public void reverse() {

            // TODO Auto-generated method stub

             

        }

        @Override

        public int length() {

            // TODO Auto-generated method stub

            return length;

        }

        @Override

        public void insert(int pos, String b) {

        }

    }

    步骤 4 : 反转 reverse

    package character;

    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();

        }

        @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 void append(String str) {

            // TODO Auto-generated method stub

        }

        @Override

        public void append(char c) {

            // TODO Auto-generated method stub

        }

        @Override

        public void insert(int pos, char b) {

            // TODO Auto-generated method stub

        }

        @Override

        public void insert(int pos, String b) {

            // TODO Auto-generated method stub

        }

        @Override

        public void delete(int start) {

            // TODO Auto-generated method stub

        }

        @Override

        public void delete(int start, int end) {

            // TODO Auto-generated method stub

        }

        @Override

        public int length() {

            // TODO Auto-generated method stub

            return length;

        }

        public String toString() {

            char[] realValue = new char[length];

            System.arraycopy(value, 0, realValue, 0, length);

            return new String(realValue);

        }

        public static void main(String[] args) {

            MyStringBuffer sb = new MyStringBuffer("there light");

            sb.reverse();

            System.out.println(sb);

        }

    }

    步骤 5 : 插入insert 和 append

    边界条件判断
    插入之前,首先要判断的是一些边界条件。 比如插入位置是否合法,插入的字符串是否为空

    扩容
    1. 要判断是否需要扩容。 如果插入的字符串加上已经存在的内容的总长度超过了容量,那么就需要扩容。
    2. 数组的长度是固定的,不能改变的,数组本身不支持扩容。 我们使用变通的方式来解决这个问题。
    3. 根据需要插入的字符串的长度和已经存在的内容的长度,计算出一个新的容量。 然后根据这个容量,创建一个新的数组,接着把原来的数组的内容,复制到这个新的数组中来。并且让value这个引用,指向新的数组,从而达到扩容的效果。

    插入字符串
    1. 找到要插入字符串的位置,从这个位置开始,把原数据看成两段,把后半段向后挪动一个距离,这个距离刚好是插入字符串的长度
    2. 然后把要插入的数据,插入这个挪出来的,刚刚好的位置里。

    修改length的值
    最后修改length的值,是原来的值加上插入字符串的长度

    insert(int, char)
    参数是字符的insert方法,通过调用insert(int, String) 也就实现了。

    append
    追加,就是在最后位置插入。 所以不需要单独开发方法,直接调用insert方法,就能达到最后位置插入的效果

    package character;

      

    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();

              

        }

          

        @Override

        public void append(String str) {

            insert(length,str);

        }

      

        @Override

        public void append(char c) {

            append(String.valueOf(c));

              

        }

      

        @Override

        public void insert(int pos, char b) {

            insert(pos,String.valueOf(b));

        }

      

        @Override

        public void delete(int start) {

            // TODO Auto-generated method stub

              

        }

      

        @Override

        public void delete(int start, int end) {

            // TODO Auto-generated method stub

              

        }

      

        @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() {

            // TODO Auto-generated method stub

            return length;

        }

      

        @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())*1.5f);

                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 = length+cs.length;

              

        }

          

        public String toString(){

              

            char[] realValue = new char[length];

      

            System.arraycopy(value, 0, realValue, 0, length);

              

            return new String(realValue);

              

        }

          

        public static void main(String[] args) {

            MyStringBuffer sb = new MyStringBuffer("there light");

            System.out.println(sb);

            sb.insert(0"let ");

            System.out.println(sb);

      

            sb.insert(10"be ");

            System.out.println(sb);

            sb.insert(0"God Say:");

            System.out.println(sb);

            sb.append("!");

            System.out.println(sb);

            sb.append('?');

            System.out.println(sb);

            sb.reverse();

            System.out.println(sb);

              

        }

      

    }

    步骤 6 : 删除 delete

    删除 delete

    package character;

    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();

             

        }

         

        @Override

        public void append(String str) {

            insert(length,str);

        }

        @Override

        public void append(char c) {

            append(String.valueOf(c));

             

        }

        @Override

        public void insert(int pos, char b) {

            insert(pos,String.valueOf(b));

        }

        @Override

        public void delete(int start) {

             

            delete(start,length);

        }

        @Override

        public void delete(int start, int end) {

            //边界条件判断

            if(start<0)

                return;

             

            if(start>length)

                return;

             

            if(end<0)

                return;

             

            if(end>length)

                return;

             

            if(start>=end)

                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() {

            // TODO Auto-generated method stub

            return length;

        }

        @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())*1.5f);

                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 = length+cs.length;

             

        }

         

        public String toString(){

             

            char[] realValue = new char[length];

            System.arraycopy(value, 0, realValue, 0, length);

             

            return new String(realValue);

             

        }

         

        public static void main(String[] args) {

            MyStringBuffer sb = new MyStringBuffer("there light");

            System.out.println(sb);

            sb.insert(0"let ");

            System.out.println(sb);

            sb.insert(10"be ");

            System.out.println(sb);

            sb.insert(0"God Say:");

            System.out.println(sb);

            sb.append("!");

            System.out.println(sb);

            sb.append('?');

            System.out.println(sb);

            sb.reverse();

            System.out.println(sb);

             

            sb.reverse();

            System.out.println(sb);

             

            sb.delete(0,4);

            System.out.println(sb);

            sb.delete(4);

            System.out.println(sb);

        }

    }


    更多内容,点击了解: https://how2j.cn/k/number-string/number-string-mystringbuilder/331.html

  • 相关阅读:
    Delphi 学习笔记
    Extjs 4
    面向对象(OOP)
    Java基础
    Ubantu(乌班图)
    CentOS 6.3操作常识
    英语音标单元音篇
    英语音标双元音篇
    英语音标辅音篇
    Oracle补习班第一天
  • 原文地址:https://www.cnblogs.com/Lanht/p/12615518.html
Copyright © 2011-2022 走看看