1. 程式人生 > >劍指offer--替換空格 以及Java StringBuffer 和 StringBuilder 類

劍指offer--替換空格 以及Java StringBuffer 和 StringBuilder 類

題目描述

請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。

1,題目中給出程式碼頭

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	
    }
}

題目中有StringBuffer類,

注意 StringBuffer 類支援的主要方法:

序號 方法描述
1 public StringBuffer append(String s)
將指定的字串追加到此字元序列。
2 public StringBuffer reverse()
 將此字元序列用其反轉形式取代。
3 public delete(int start, int end)
移除此序列的子字串中的字元。
4 public insert(int offset, int i)
將 int 引數的字串表示形式插入此序列中。
5 replace(int start, int end, String str)
使用給定 String
 中的字元替換此序列的子字串中的字元

所以,不能使用String 類中的replace(int i,String str)方法

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	// TODO Auto-generated method stub
        if (str == null || str.length() <= 0) {
            return null;
        }
        return str.replace(" ", "%20");
    }
    
}

參考:https://blog.csdn.net/lc013/article/details/53507329

下面的列表裡的方法和 String 類的方法類似:

序號 方法描述
1 int capacity()
返回當前容量。
2 char charAt(int index)
返回此序列中指定索引處的 char 值。
3 void ensureCapacity(int minimumCapacity)
確保容量至少等於指定的最小值。
4 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
將字元從此序列複製到目標字元陣列 dst
5 int indexOf(String str)
返回第一次出現的指定子字串在該字串中的索引。
6 int indexOf(String str, int fromIndex)
從指定的索引處開始,返回第一次出現的指定子字串在該字串中的索引。
7 int lastIndexOf(String str)
返回最右邊出現的指定子字串在此字串中的索引。
8 int lastIndexOf(String str, int fromIndex)
返回 String 物件中子字串最後出現的位置。
9 int length()
 返回長度(字元數)。
10 void setCharAt(int index, char ch)
將給定索引處的字元設定為 ch
11 void setLength(int newLength)
設定字元序列的長度。
12 CharSequence subSequence(int start, int end)
返回一個新的字元序列,該字元序列是此序列的子序列。
13 String substring(int start)
返回一個新的 String,它包含此字元序列當前所包含的字元子序列。
14 String substring(int start, int end)
返回一個新的 String,它包含此序列當前所包含的字元子序列。
15 String toString()
返回此序列中資料的字串表示形式。

但可以使用StringBuffer 類中的replace(int start, int end, String str) 使用給定 String 中的字元替換此序列的子字串中的字元

 

public class Solution1 {
    public static void main(String[] args) {
        String s = "1 2 3 4 5 6 7 8 9 0";
        /**
         * 注意方法replaceSpace(StringBuffer str) 裡面的變數型別是StringBuffer型別,
         * 使用之前需要先進行轉換
         */
        StringBuffer s1 = new StringBuffer(s);

        s = replaceSpace(s1);
        System.out.println(s);
    }

   static  public String replaceSpace(StringBuffer str) {
        for (int k = 0; k < str.length(); k++) {
            char index = str.charAt(k);
            if (index == ' ') {
                str.replace(k, k + 1, "%20");//使用給定 String 中的字元替換此序列的子字串中的字元
                //這裡用的巧妙,不用考慮變換後長度問題。
            }
        }

        return str.toString();//    StringBuffer轉換為String

    }

}

注意:java.lang.StringBuffer的用法 參考:https://blog.csdn.net/u014523777/article/details/65440480

1、StringBuffer物件的初始化

StringBuffer物件的初始化不像String類的初始化一樣,Java提供的有特殊的語法,而通常情況下一般使用構造方法進行初始化

例如:

StringBuffer s = new StringBuffer();

這樣初始化出的StringBuffer物件是一個空的物件,就是我犯的錯誤。

如果需要建立帶有內容的StringBuffer物件,則可以使用:

StringBuffer s = new StringBuffer(“abc”);

這樣初始化出的StringBuffer物件的內容就是字串”abc”。

需要注意的是,StringBuffer和String屬於不同的型別,也不能直接進行強制型別轉換,下面的程式碼都是錯誤的:

StringBuffer s = “abc”; //賦值型別不匹配

StringBuffer s = (StringBuffer)”abc”; //不存在繼承關係,無法進行強轉

StringBuffer物件和String物件之間的互轉的程式碼如下

String s = “abc”;

StringBuffer sb1 = new StringBuffer(“123”);

StringBuffer sb2 = new StringBuffer(s); //String轉換為StringBuffer

String s1 = sb1.toString(); //StringBuffer轉換為String

、StringBuffer的常用方法

StringBuffer類中的方法主要偏重於對於字串的變化,例如追加、插入和刪除等,這個也是StringBuffer和String類的主要區別。

a、append方法

public StringBuffer append(boolean b)

該方法的作用是追加內容到當前StringBuffer物件的末尾,類似於字串的連線。呼叫該方法以後,StringBuffer物件的內容也發生改變,例如:

StringBuffer sb = new StringBuffer(“abc”);

sb.append(true);

則物件sb的值將變成”abctrue”。

使用該方法進行字串的連線,將比String更加節約內容,例如應用於資料庫SQL語句的連線,例如:

StringBuffer sb = new StringBuffer();

String user = “test”;

String pwd = “123”;

sb.append(“select * from userInfo where username=“)

.append(user)

.append(“ and pwd=”)

.append(pwd);

這樣物件sb的值就是字串“select * from userInfo where username=test and pwd=123”。

b、deleteCharAt方法

public StringBuffer deleteCharAt(int index)

該方法的作用是刪除指定位置的字元,然後將剩餘的內容形成新的字串。例如:

StringBuffer sb = new StringBuffer(“Test”);

sb. deleteCharAt(1);

該程式碼的作用刪除字串物件sb中索引值為1的字元,也就是刪除第二個字元,剩餘的內容組成一個新的字串。所以物件sb的值變為”Tst”。

還存在一個功能類似的delete方法:

public StringBuffer delete(int start,int end)

該方法的作用是刪除指定區間以內的所有字元,包含start,不包含end索引值的區間。例如:

StringBuffer sb = new StringBuffer(“TestString”);

sb. delete (1,4);

該程式碼的作用是刪除索引值1(包括)到索引值4(不包括)之間的所有字元,剩餘的字元形成新的字串。則物件sb的值是”TString”。

c、insert方法

public StringBuffer insert(int offset, boolean b)

該方法的作用是在StringBuffer物件中插入內容,然後形成新的字串。例如:

StringBuffer sb = new StringBuffer(“TestString”);

sb.insert(4,false);

該示例程式碼的作用是在物件sb的索引值4的位置插入false值,形成新的字串,則執行以後物件sb的值是”TestfalseString”。

d、reverse方法

public StringBuffer reverse()

該方法的作用是將StringBuffer物件中的內容反轉,然後形成新的字串。例如:

StringBuffer sb = new StringBuffer(“abc”);

sb.reverse();

經過反轉以後,物件sb中的內容將變為”cba”。

e、setCharAt方法

public void setCharAt(int index, char ch)

該方法的作用是修改物件中索引值為index位置的字元為新的字元ch。例如:

StringBuffer sb = new StringBuffer(“abc”);

sb.setCharAt(1,’D’);

則物件sb的值將變成”aDc”。

f、trimToSize方法

public void trimToSize()

該方法的作用是將StringBuffer物件的中儲存空間縮小到和字串長度一樣的長度,減少空間的浪費。

總之,在實際使用時,String和StringBuffer各有優勢和不足,可以根據具體的使用環境,選擇對應的型別進行使用

 

關於空格替換的整理版

方法:https://blog.csdn.net/qq_35334269/article/details/78961901?utm_source=blogxgwz2